Почему некоторые методы C # используют объект для передачи параметров вместо фактической передачи их напрямую? - PullRequest
0 голосов
/ 24 апреля 2018

Я видел некоторые методы C #, такие как ThreadPool.QueueUserWorkItem (WaitCallback, Object) , которые принимают метод (в данном случае «WaitCallback»), но вместо предоставления опции для прямой передачи аргументовметод, вместо этого возьмите отдельную Object, которая может предоставить их.Таким образом, вы не можете сделать что-то вроде того, что вам задают здесь .

Мой вопрос: почему?Должна быть техническая причина, чтобы использовать этот подход и не разрешать что-то вроде

ThreadPool.QueueUserWorkItem(new WaitCallback(Multiply(2, 3)));

private int Multiply(int x,int y)
{
  int z=(x*y);
  return z;
}

1 Ответ

0 голосов
/ 24 апреля 2018

Поскольку вы хотите передать делегат в WaitCallBack.Проще говоря, вы хотите указать WaitCallBack метод, который должен выполнить поток, но вы не хотите вызывать этот метод сейчас .

В вашем примере

ThreadPool.QueueUserWorkItem(new WaitCallback(Multiply(2, 3)));

метод Multiply будет вызван напрямую, а его результат должен быть передан конструктору WaitCallback (что невозможно).

Компилятору не удастся решить,Вы хотели позвонить Multiply здесь или просто сказать WaitCallback, что должен делать этот вызов, потому что это будет абсолютно тот же синтаксис.

Вот почему вы говорите, какой метод метод, который он должен вызывать и - отдельно - какой аргумент он должен передать, когда он в конечном итоге вызывает его.


Но вместо этого вы можете использовать лямбду:

ThreadPool.QueueUserWorkItem(o => Multiply(2, 3));

Теперь поток может выполнить эту лямбду, которая в свою очередь вызывает Multiply(2, 3) (отбрасывая аргумент o).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...