如何在C#中声明委托实例?

时间:2013-11-10 09:51:00

标签: c# delegates

private delegate void stopMachineryDelegate();
public stopMachineryDelegate StopMachinery;

this.StopMachinery += new stopMachineryDelegate(painting);

在上面的第二行示例中,我们是创建委托实例还是委托变量?如果第二行创建了stopMachineryDelegate类型的委托实例,那么在第三行中我们在做什么?

2 个答案:

答案 0 :(得分:2)

在第二行,您声明了stopMachineryDelegate类型的变量。但此时变量仍然未分配,保留默认值null

在第三行,您将通过创建指向painting函数的委托的新实例为此变量赋值。

因此,一旦分配了此变量,您就可以使用它来调用它指向的函数:

this.StopMachinery();

基本上会在同一个类中调用painting方法。

答案 1 :(得分:2)

第一行用于定义委托类型(stopMachineryDelegate),作为委托,不接受任何参数并且不返回任何值(void)。

第二行是声明该类型的字段,名为StopMachinery。此时,StopMachinery为空。

第三行背后有一些语法糖。如果此时StopMachinery为空,它将创建该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委托的调用将按照指定的顺序同步调用调用列表中的每个方法。