Первая строка используется для определения вашего типа делегата (stopMachineryDelegate
), поскольку делегат не принимает никаких параметров и не возвращает никаких значений (void
).
Вторая строка объявляет поле такого типа, которое называется StopMachinery
. В этот момент StopMachinery
имеет значение null.
Третья строка содержит синтаксический сахар. Если StopMachinery
имеет значение null в этой точке, он создаст новый экземпляр этого MulticastDelegate
, а затем добавит делегат painting
в свой список вызовов.
Если вы только хотели назначить одного делегата в этой области, вы могли бы просто написал:
// implicitly wrap the `painting` method into a new delegate and
// assign to the `StopMachinery` field
this.StopMachinery = painting;
С другой стороны, с помощью +=
позволяет указать список делегатов, которые будут вызываться, когда вам вызывать StopMachinery
:
this.StopMachinery += painting;
this.StopMachinery += someOtherMethod;
this.StopMachinery += yetAnotherMethod;
в последнем случае призывание StopMachinery
делегат будет ссылаться на каждый из методов в списке вызовов, синхронно, в порядке их указания.
Итак, когда мы добавляем делегат делегата рисования и некоторые другие делегаты к недавно созданному экземпляру MulticastDelegate, значит, это означает, что экземпляр MulticastDelegate ссылается на экземпляры делегатов, таких как делегат метода рисования? –
@kaustav: добавление делегатов в делегат 'StopMachinery' с помощью оператора' + = 'добавляет их во внутренний список внутри делегата (« список вызовов »). Эта операция обычно выполняется для событий и иногда называется «прикреплением» (т. Е. Прикрепляет обработчик к событию). Если вы затем вызовете этот делегат позже в своей программе (т. Е. Вызовите 'StopMachinery();'), он будет последовательно ссылаться на все методы, которые вы приложили к нему, один за другим. Это основная идея под «шаблоном наблюдателя», который используется [широко через BCL] (http://msdn.microsoft.com/en-us/library/ee817669.aspx). – Groo
@kaustav: этот шаблон широко используется в WinForms: всякий раз, когда вы, например, присоединяете обработчик к событию 'Click' кнопки' Button', вы просто добавляете метод (завернутый в экземпляр делегата) к вызову список делегата 'Click' multicast. Когда нажимается кнопка, она будет вызывать все «подписчики» для этого события последовательно. Также обратите внимание, что надлежащая программа должна (в некоторый момент времени) отсоединиться от этого списка с помощью оператора '- =', чтобы избежать вызова после того, как он больше не нуждается в функциональности. – Groo