如何在C#中声明委托实例?
在上面第二行的示例中,我们是创建委托实例还是委托变量?如果第二行创建类型为stopMachineryDelegate的委托实例,那么在第三行中我们在做什么?在第二行中,您正在声明类型为如何在C#中声明委托实例?,c#,delegates,C#,Delegates,在上面第二行的示例中,我们是创建委托实例还是委托变量?如果第二行创建类型为stopMachineryDelegate的委托实例,那么在第三行中我们在做什么?在第二行中,您正在声明类型为stopMachineryDelegate的变量。但此时变量仍然未赋值,其默认值为null 在第三行,通过创建指向绘制函数的代理的新实例,为该变量赋值 因此,一旦分配了此变量,您就可以使用它来调用它所指向的函数: private delegate void stopMachineryDelegate(); publ
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中广泛使用:例如,每当您将处理程序附加到按钮的事件上时,您实际上