Что => оператор в этом коде

Я использую ThreadPool с кодом follwoing:-

ThreadPool.QueueUserWorkItem
                (o =>
                MyFunction()
                );

Я не уверен, что делает o=> делает в этом коде. Может любой выручать меня.

6
задан Zeeshan Umar 28 June 2010 в 04:57
поделиться

3 ответа

Здесь описывается лямбда (анонимная) функция. В данном случае это функция, которая принимает один аргумент, o, а затем выполняет MyFunction (хотя в этом случае она, по сути, отбрасывает значение o). Это эквивалентно:

void Foo(object o) //We know that Foo takes an object and returns void because QueueUserWorkItem expects an instance of type WaitCallback which is a delegate that takes and object and returns void
{
  MyFunction();
}

ThreadPool.QueueUserWorkItem(Foo) // or ThreadPool.QueueUserWorkItem(new WaitCallback(Foo));

Тип o определяется на основе того, что ожидает QueueUserWorkItem. QueueUserWorkItem ожидает тип WaitCallback, поэтому в данном случае o должен быть типа object, так как WaitCallback является делегатом для методов с одним параметром типа object, которые возвращают void.

Что касается смысла этого конкретного фрагмента кода, то, по сути, вы добавляете функцию (рабочий элемент) в очередь, которая будет выполнена одним из потоков в пуле (когда он станет доступен). Этот конкретный фрагмент кода просто описывает хороший, лаконичный способ передачи функции без необходимости полностью определять метод класса.

Кстати, я, да и другие, склонны читать => как 'such that'. Некоторые люди читают его как 'goes to'.

11
ответ дан 8 December 2019 в 14:40
поделиться

Это синтаксис C # для лямбда-выражения.

Во многих отношениях это определение встроенного делегата. Это избавляет вас от утомительного определения дополнительной функции для использования в качестве цели делегата.

private object Target(object state) {
  MyFunction();
}

...
ThreadPool.QueueUserWorkItem(new WaitCallback(Target));
3
ответ дан 8 December 2019 в 14:40
поделиться

Он объявляет анонимный метод. По сути, вы передаете метод, тело которого - {MyFunction (); } в качестве параметра метода QueueUserWorkItem. Я не проверял, но он также должен быть эквивалентен:

ThreadPool.QueueUserWorkItem(MyFunction);
2
ответ дан 8 December 2019 в 14:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: