Зачем использовать "new DelegateType (Delegate)"? - PullRequest
8 голосов
/ 12 октября 2011

Хорошо, предположим, вы определили делегата в каком-то классе.

public delegate void StringDelegate (string s);

и другой класс реализует метод:

public static void StringWriter (string s) {...}

В книге, которую я читаю "Программирование на C #", четвертое, они создают делегатов, используя ключевое слово new , например:

ClassDelegate.StringDelegate writer;
writer = new ClassDelegate.StringDelegate (DelegateImplementer.StringWriter);
writer("Hello");

Тем не менее, я вижу, что можно также вызвать метод делегата таким образом

ClassDelegate.StringDelegate writer;
writer = DelegateImplementer.StringWriter;
writer ("Hello");

Какая разница? Почему я хочу создать экземпляр и создать делегат объекта, когда я могу просто передать или сделать ссылку на подпись делегата метода.

Ответы [ 5 ]

5 голосов
/ 12 октября 2011

Между этими двумя утверждениями нет абсолютно никакой разницы.writer = DelegateImplementer.StringWriter; по-прежнему создает delegate объект;компилятор сгенерирует new ClassDelegate.StringDelegate () для вас.Это просто более чистый синтаксис, который был добавлен в C # 2.0 .

. Как упоминал в своем ответе @Ben Voigt, требуется только в C # 2.0, где компилятор не может определить тип делегата, например, Control.Invoke () .

4 голосов
/ 12 октября 2011

Два эквивалентны.Последний синтаксис новый с C # 2.0.

4 голосов
/ 12 октября 2011

Иногда правильный тип не может быть выведен (например, когда вы вызываете универсальный), в таком случае вам нужно сообщить компилятору, какой тип делегата вы хотите.

Большинство изВремя, однако, называет группу методов проще и понятнее.

1 голос
/ 12 октября 2011

Это синтаксический сахар.В конечном итоге оба набора кода делают одно и то же.

Я также хотел бы отметить, что в .Net встроено несколько универсальных делегатов, которые могут сэкономить вам много кода.В этом случае я бы сделал:

Action<string> writer;
writer = DelegateImplementer.StringWriter;
writer ("Hello");

Таким образом, вам даже не нужно создавать свой собственный делегат.

1 голос
/ 12 октября 2011

Оба одинаковы, но последний синтаксис был добавлен в C # 2 для упрощения использования делегата.

Оба метода компилируются в один и тот же байт-код.

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