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

如何在C#中声明委托实例?,c#,delegates,C#,Delegates,在上面第二行的示例中,我们是创建委托实例还是委托变量?如果第二行创建类型为stopMachineryDelegate的委托实例,那么在第三行中我们在做什么?在第二行中,您正在声明类型为stopMachineryDelegate的变量。但此时变量仍然未赋值,其默认值为null 在第三行,通过创建指向绘制函数的代理的新实例,为该变量赋值 因此,一旦分配了此变量,您就可以使用它来调用它所指向的函数: private delegate void stopMachineryDelegate(); publ

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

在第二行中,您正在声明类型为
stopMachineryDelegate
的变量。但此时变量仍然未赋值,其默认值为
null

在第三行,通过创建指向
绘制
函数的代理的新实例,为该变量赋值

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

private delegate void stopMachineryDelegate();
public stopMachineryDelegate StopMachinery;

this.StopMachinery += new stopMachineryDelegate(painting);

它基本上会在同一个类中调用
绘制
方法。

在第二行,您正在声明类型为
stopMachineryDelegate
的变量。但此时变量仍然未赋值,其默认值为
null

在第三行,通过创建指向
绘制
函数的代理的新实例,为该变量赋值

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

private delegate void stopMachineryDelegate();
public stopMachineryDelegate StopMachinery;

this.StopMachinery += new stopMachineryDelegate(painting);

这将基本上调用同一类中的
绘制
方法。

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

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

第三行后面有一些语法上的甜点。如果
StopMachinery
在该点为空,它将创建该
MulticastDelegate
的一个新实例,然后将
painting
方法委托添加到其调用列表中

如果您只想为该字段分配一个委托,您可以简单地编写:

this.StopMachinery();
另一方面,使用
+=
可以指定在调用
stopmachine
时要调用的代理列表:

 // implicitly wrap the `painting` method into a new delegate and 
 // assign to the `StopMachinery` field
 this.StopMachinery = painting;  

在后一种情况下,调用
stopMachineryDelegate
委托将按照指定的顺序同步调用调用列表中的每个方法。

第一行用于将委托类型(
stopMachineryDelegate
)定义为不接受参数且不返回值的委托(
void

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

第三行后面有一些语法糖。如果
stopmachine
在该点为null,它将创建该
MulticastDelegate
的新实例,然后将
painting
方法委托添加到其调用列表中

如果您只想为该字段分配一个委托,您可以简单地编写:

this.StopMachinery();
另一方面,使用
+=
可以指定在调用
stopmachine
时要调用的代理列表:

 // implicitly wrap the `painting` method into a new delegate and 
 // assign to the `StopMachinery` field
 this.StopMachinery = painting;  

在后一种情况下,
stopmachine
委托的调用将按照指定的顺序同步调用调用列表中的每个方法。

因此,当我们将绘画方法委托和一些其他委托添加到新创建的MulticastDelegate实例时,这是否意味着MulticastDelegate实例是否引用代理的实例,如绘制方法委托?@kaustav:使用
+=
操作符将代理添加到
停止机器
委托中,将其添加到代理内部的一个列表(“调用列表”)。此操作通常针对事件执行,有时称为“附加”(即,将处理程序附加到事件)。如果随后在程序中调用此委托(即调用
StopMachinery();
),它将依次调用附加到它的所有方法。这是“观察者模式”下的基本思想“@kaustav:此模式在WinForms中广泛使用:例如,每当您将处理程序附加到
按钮的
单击事件时,实际上您只是添加了一个方法(包装在委托实例中)单击
多播委托的调用列表。单击按钮时,它将按顺序调用该事件的所有“订阅者”。还要注意,适当的程序应该(在某个时间)使用
-=
运算符从此列表中分离,以避免在不再需要该功能后被调用。@kaustav:“引用委托的实例”?是的,我想你可以这么说。它包含对委托实例的引用列表。这也是为什么GC永远不会收集实例对象,这些实例对象包含附加到可访问对象的事件的方法,直到你使用所提到的
-=
操作符分离它们。因此,当我们将绘画方法委托和一些其他委托添加到他新创建了MulticastDelegate实例,那么这是否意味着MulticastDelegate实例是指代理的实例,如绘制方法delegate?@kaustav:使用
+=
操作符将代理添加到
代理的内部列表(“调用列表”)中。此操作通常针对事件执行,有时称为“附加”(即将处理程序附加到事件)。如果稍后在程序中调用此委托(即调用
stopmachine();
),它将依次调用附加到它的所有方法。这是“观察者模式”下的基本思想“@kaustav:此模式在WinForms中广泛使用:例如,每当您将处理程序附加到
按钮的
事件上时,您实际上