Работаем ли мы с делегатами или экземплярами делегатов? - PullRequest
1 голос
/ 08 февраля 2011

Просто терминология ... насколько я понимаю, делегат - это тип, и нужно иметь его экземпляр. Таким образом, я не назначаю метод для делегирования, но для экземпляра этого делегата, это правильно? Кажется, что на MSDN они небрежные или я не очень хорошо понял.

Ответы [ 3 ]

1 голос
/ 08 февраля 2011

Ну да и нет.«Делегат», как термин, который чаще всего используется, относится к «ссылке на метод», которую можно назвать «экземпляром делегата».В логическом смысле этот экземпляр является «делегатом»;это относится к фактическому методу, который вызывающие абоненты будут использовать для выполнения какой-либо задачи, которую они не могут или не должны выполнять сами.

Когда вы определяете public delegate void MyDelegate();, вы определяете «тип делегата», который устанавливаетправильная подпись методов, которые могут быть использованы в качестве делегатов в этом случае.Это разница между классом и объектом;класс - это шаблон, объект - это экземпляр, соответствующий шаблону.

1 голос
/ 08 февраля 2011

Это близко к праву.У вас есть неизменный экземпляр делегата.И вы можете добавить методы, которые имеют те же подписи, что и тип делегата, что создает новые экземпляры делегата.Например, с типом делегата Func<int>:

Func<int> f;

Экземпляр еще не существует.

f = () => 5;

Теперь у нас есть его экземпляр.*

Старый экземпляр исчез, и теперь у нас есть новый.Но когда вы вызываете f(), оба метода будут выполнены.Возвращаемое значение будет последним, добавленным к экземпляру делегата.

0 голосов
/ 10 февраля 2011

Термин «делегат» используется для обозначения двух разных вещей:

  1. Статический класс, который определяет сигнатуру метода и тип возвращаемого значения и включает некоторую «склеивающую» логику.
  2. Экземпляр объекта с методом Invoke, сигнатура функции которого совпадает с сигнатурой статического класса, описанного выше.

К сожалению, я не знаю какой-либо стандартной номенклатуры, чтобы различать их, но, возможно, можно использоватьтермины «подпись делегата» и «ActionDelegate» или «FunctionDelegate».

Между прочим, термины «объект», «ссылка» и «деструктор» вызывают аналогичную путаницу.Я предпочитаю использовать фразу «идентификатор объекта» для ссылки на переменные, которые указывают на «экземпляры объекта», использовать термин «ссылка» исключительно для семантики параметров передачи по ссылке и вообще избегать «деструктор» в пользу «финализатора»"и" disposer ".

...