C # Делегация Instantiation против Просто Передача Ссылка Метода - PullRequest
9 голосов
/ 02 февраля 2010

У меня простой вопрос: в чем преимущество создания экземпляра делегата C # по сравнению с простой передачей ссылки на функцию? Я имею в виду:

Почему:

Thread t = new Thread(new ThreadStart(SomeObject.SomeMethod));

Когда вы можете сделать:

Thread t = new Thread(SomeObject.SomeMethod);

Оба скомпилируются и будут работать на моем опыте ... я что-то упустил?

Ответы [ 3 ]

6 голосов
/ 02 февраля 2010

Пока у группы методов SomeObject.SomeMethod есть метод с типом возврата void и без параметров, разницы нет. Это потому, что ThreadStart определяется как delegate, который возвращает void и не принимает параметров, и, следовательно, существует неявное преобразование из группы методов SomeObject.SomeMethod в ThreadStart. Таким образом, оба вызывают перегрузку Thread(ThreadStart) конструктора Thread.

Соответствующий раздел спецификации языка - §6.6 (Преобразование групп методов).

У меня простой вопрос: в чем преимущество создания экземпляра делегата C # по сравнению с простой передачей ссылки на функцию?

Итак, просто исправление терминологии здесь. С

class MyObject {
    public void SomeMethod() { }
}

MyObject someObject = new MyObject();

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

4 голосов
/ 02 февраля 2010

Компилятор выведет, что когда вы набираете более короткий код, вы имеете в виду более длинный код. Там нет разницы в конечном эффекте. Если вы хотите ясности полного конструктора, вы можете вставить его; если вам нужна краткость только группы методов, вы можете разрешить компилятору выводить конструктор. Это просто стилистический выбор.

0 голосов
/ 02 февраля 2010

Это эквивалентно. Хорошая вводная статья на эту тему: C # делегаты, анонимные методы и лямбда-выражения - O My!

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