2010-02-02 3 views
9

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

Почему:

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

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

Thread t = new Thread(SomeObject.SomeMethod); 

И будет собирать и работать в моем опыте ... я что-то отсутствует?

+0

Возможный дубликат [В чем разница между новым действием() и лямбдой?] (Http://stackoverflow.com/questions/765966/what-is-the-difference-between-new-action-and- a-lambda) – nawfal

ответ

6

Если у группы методов 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.

+1

Является ли 'someObject.SomeMethod()' также группой методов? –

+1

@John Feminella: Нет, это будет вызов метода. – jason

+0

Хм, хорошо. Что, если 'SomeMethod' имел несколько перегрузок, чья подпись соответствовала' SomeMethod (...) ', где' ... '- произвольные параметры? Это группа методов тогда, поскольку она может ссылаться на один из нескольких методов и еще не разрешена? –

4

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