用于事件.NET的代表?(Are .NET delegates used for events?)

2019-09-19 04:48发布

我有点困惑,我知道代表是像函数指针,它们被用来传递函数作为参数传递给方法。

这是如何配合到事件模型?

呼叫:

myButton.OnClick += new .....();

是内部刚好路过的方法/函数的参数在事件发生时,所有的用户都收到该事件?

Answer 1:

看看这个

好奇心是福



Answer 2:

当你这样做:

myButton.OnClick += new ...();

你将你的委托作为一个用户到该事件。 当引发后来的情况下,所有的用户将被调用(不保证有关订单)。 这就是所谓的多播委托。 它有点像它允许“点”到一个以上功能的额外的奖励函数指针。

请注意,现在你不需要明确创建委托,你可以只使用方法名:

myButton.OnClick += MethodName;

而且不要忘记,你可以(也应该看到为什么 )从事件退订您订阅防止泄漏:

myButton.OnClick -= MethodName;


Answer 3:

本次活动有两个运营商; 添加和删​​除。 当你(在你的例子作为)添加事件处理程序,该事件将得到该方法的引用,并将其添加到其订阅的事件处理程序的列表。 当引发事件,它会经过列表,并调用它的方法。



Answer 4:

事实上, 委托很像一个函数指针。 第一个区别是,委托由2“指针”组成:一个函数指针和一个实例的指针。 毫不奇怪,委托类有这两个属性:

// Gets the method represented by the delegate.
public MethodInfo Method { get; }

// Gets the class instance on which the current delegate
// invokes the instance method.
public object Target { get; }

第二个区别是,.NET代表可以被多播 。 这是可能的在一个MulticastDelegate添加两个代表。 这也可以从一个多播委托删除的委托。 当被调用时,多播委托将调用其所有的儿童代表。 这可能会带动其他的问题,但我会从原来的问题被偏离。


一个事件 ,在另一方面,是一个完全不同的东西。 事实上,一个事件是特殊的访问器的属性。 普通属性有以下两个访问:getset。 事件有两个替代: 添加删除

add访问将结合目前的代表是与新的委托的情况下为多播委托。 remove访问却反其道而行之。

有了这一点,很容易理解为什么C#设计人员挑选了+ =- =操作符。 我的意思是,下面的两行是有点相当于(如果你忽略了这一事实,第二)。

myButton.OnClick += newEventHandler;
myButton.OnClick = myButton.OnClick + newEventHandler;


Answer 5:

本次活动,这在点击一个按钮的情况下是“点击”事件中,充当“函数指针”在这里。 意思是,当你使用+ =语法添加你的方法给它,你基本上做的Click函数指针指向你的函数。 因此,当单击按钮时,点击函数指针调用所有的功能,它的指向。 说得通?



Answer 6:

事件是基于委托的属性。

它包装专用(和隐藏)代表成员。



Answer 7:

按钮有一个私人“多播委托”字段和公共财产,如“点击”您使用+ =和 - =运营商是管理私有字段的状态自动生成方式。

当按钮内部引发Click事件,则调用私有多播委托,将调用,它目前所知道的所有代表。


该系统可以是混乱首先实现自己的活动的时候,因为相同的标识符,“事件名称”,指的是你的类中的一件事(私有多播委托场)和类之外的另一件事(公共管理机制,该场)。



Answer 8:

一个“事件”是一个多播委托。 例如:

public class ObservableObject : INotifyPropertyChanging, INotifyPropertyChanged
{
    public event PropertyChangedEventHandler   PropertyChanged;
}

INotifyPropertyChanged的方案的实现包括public event PropertyChangedEventHandler PropertyChanged 。 PropertyChangedEventHandler是一个代表声明如下:

public delegate void PropertyChangedEventHandler(object sender, PropertyChangedEventArgs e);

那么,什么是这个修饰符事件在做什么? 第一只含有实例可以调用它。 第二客户端只能添加/从实例中删除处理程序/。

编译器把两种方法add_PropertyChanged和remove_PropertyChanged编译器,标志着该成员的私人。



Answer 9:

我同意所有这就是说,我只是想补充我的两分钱。

如果我要重新写的文档我要说,代表的是语言的指针和部分,而事件是一个框架,允许您使用Windows的事件和消息泵的仪器的一部分。 尝试使用ASP.NET下活动,需要等待一个事件时,您注意到这一点。 (更多信息http://discuss.joelonsoftware.com/default.asp?joel.3.456478.15 )我的问题是多路广播委托在之间的一些版本,所以是很难区分的,明确他们。

委托是指向一个功能MultiCastdelegate是一个名称下聚集委托列表

事件是一个修饰符,做主叫(见BackgroundWorker的和AsyncOperationManager)的ThreadContext下不同1.运行的几件事情。 2.事件可以被添加到接口(澄清OO连接)

听者2的上下文下一个委托1.奔跑不能被添加到接口

阅读http://blogs.msdn.com/b/jaybaz_ms/archive/2004/06/17/158636.aspx关于一般事件和比赛条件更多的数据。



文章来源: Are .NET delegates used for events?