2013-11-10 5 views
1
private delegate void stopMachineryDelegate(); 
public stopMachineryDelegate StopMachinery; 

this.StopMachinery += new stopMachineryDelegate(painting); 

В приведенном выше примере во второй строке мы создаем экземпляр делегата или переменную делегата? Если вторая строка создает делегатский экземпляр типа stopMachineryDelegate, то в третьей строке мы делаем?Как объявить экземпляр делегата в C#?

ответ

2

Первая строка используется для определения вашего типа делегата (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 делегат будет ссылаться на каждый из методов в списке вызовов, синхронно, в порядке их указания.

+0

Итак, когда мы добавляем делегат делегата рисования и некоторые другие делегаты к недавно созданному экземпляру MulticastDelegate, значит, это означает, что экземпляр MulticastDelegate ссылается на экземпляры делегатов, таких как делегат метода рисования? –

+0

@kaustav: добавление делегатов в делегат 'StopMachinery' с помощью оператора' + = 'добавляет их во внутренний список внутри делегата (« список вызовов »). Эта операция обычно выполняется для событий и иногда называется «прикреплением» (т. Е. Прикрепляет обработчик к событию). Если вы затем вызовете этот делегат позже в своей программе (т. Е. Вызовите 'StopMachinery();'), он будет последовательно ссылаться на все методы, которые вы приложили к нему, один за другим. Это основная идея под «шаблоном наблюдателя», который используется [широко через BCL] (http://msdn.microsoft.com/en-us/library/ee817669.aspx). – Groo

+0

@kaustav: этот шаблон широко используется в WinForms: всякий раз, когда вы, например, присоединяете обработчик к событию 'Click' кнопки' Button', вы просто добавляете метод (завернутый в экземпляр делегата) к вызову список делегата 'Click' multicast. Когда нажимается кнопка, она будет вызывать все «подписчики» для этого события последовательно. Также обратите внимание, что надлежащая программа должна (в некоторый момент времени) отсоединиться от этого списка с помощью оператора '- =', чтобы избежать вызова после того, как он больше не нуждается в функциональности. – Groo

2

На второй строке вы объявляете переменную типа stopMachineryDelegate. Но в этот момент переменная по-прежнему не назначена, имея значение по умолчанию null.

В третьей строке вы назначаете значение этой переменной, создавая новый экземпляр делегата, указывающий на функцию painting.

Так как только эта переменная присваивается вы можете использовать его для вызова функции он указывает на:

this.StopMachinery(); 

, которые в основном будут вызывать метод painting в том же классе.

Смежные вопросы