Почему этот синтаксис делегата является «легальным»? - PullRequest
0 голосов
/ 20 июля 2011

Я читаю об анонимных методах и пытаюсь обернуть голову вокруг этого примера:

List<int> evenNumbers = list.FindAll(delegate(int i)<br> { return (i % 2) == 0; } )

Почему delegate(int i) законно? Вам не нужно объявлять new delegate void или что-то в этом роде.

Это то, что подразумевается под анонимным методом? Это добавленный синтаксический сахар, который допускает анонимные методы?

Ответы [ 3 ]

4 голосов
/ 20 июля 2011

Это законно из-за того, что вы подозреваете, оно создает анонимный делегат / метод.

Альтернатива (с использованием оператора lambda => ) будет:

List<int> evenNumbers = list.FindAll((i) => ((i % 2) == 0));

или

List<int> evenNumbers = list.FindAll(i => i % 2 == 0);

См. Лямбда-выражения для дальнейшего чтения.

1 голос
/ 20 июля 2011

Если вы немного разложите оператор, надеюсь, он станет более очевидным - это эквивалентный код.

Predicate<int> test = delegate(int i)
{
    return (i % 2) == 0;
};

List<int> evenNumbers = list.FindAll(test);

Как вы можете видеть, он создал анонимного делегата (который компилятор превратится в закулисный метод)

Лично я всегда находил "встроенный" синтаксис анонимного делегатачтобы скрыть проблему больше, чем добавить ясности, тогда как та же самая конструкция, построенная с использованием лямбда-выражения, как только вы используете синтаксис, добавляет ясности

List<int> evenNumbers = list.FindAll(i => i % 2 == 0);
0 голосов
/ 20 июля 2011

в этом коде похоже на передачу метода в метод с использованием делегата.

...