У меня есть простой вопрос: что преимуществом инстанцирования является делегат C# в противоположность просто передаче ссылки на функцию? То, что я имею в виду:
Почему сделайте:
Thread t = new Thread(new ThreadStart(SomeObject.SomeMethod));
Когда можно сделать:
Thread t = new Thread(SomeObject.SomeMethod);
Оба будут компилировать и работать, по моему опыту..., я пропускаю что-то?
Пока группа методов SomeObject.SomeMethod
имеет метод с типом возврата void
и не принимает параметров, разница отсутствует. Это связано с тем, что ThreadStart
определяется как делегат
, который возвращает void
и не принимает параметров, и поэтому происходит неявное преобразование из группы методов SomeObject.SomeMethod
в ThreadStart
. Таким образом, оба метода вызывают перегрузку ThreadStart
конструктора Thread
.
Соответствующим разделом спецификации языка является §6.6 (Групповые преобразования методов).
У меня возникает простой вопрос: в чем преимущество инстанцирования делегата C# по сравнению с простой передачей ссылки на функцию?
Итак, просто исправление терминологии. С
class MyObject {
public void SomeMethod() { }
}
MyObject someObject = new MyObject();
вещь, обозначаемая someObject.SomeMethod
- это группа методов. Вы можете просто подумать о ней, как о наборе перегруженных методов, которые можно посмотреть, используя обозначение someObject.SomeMethod
.
Компилятор сделает вывод, что когда вы набирали более короткий код, вы имели в виду более длинный. Нет никакой разницы в конечном результате. Если вы хотите ясности полного конструктора, вы можете вставить его; если вы хотите краткости только группы методов, вы можете позволить компилятору сделать вывод о конструкторе. Это просто стилистический выбор.
Это эквивалентно. Хорошая вводная статья на эту тему: C# Делегаты, анонимные методы и выражения лямбды - O My!