我有点困惑,我知道代表是像函数指针,它们被用来传递函数作为参数传递给方法。
这是如何配合到事件模型?
呼叫:
myButton.OnClick += new .....();
是内部刚好路过的方法/函数的参数在事件发生时,所有的用户都收到该事件?
我有点困惑,我知道代表是像函数指针,它们被用来传递函数作为参数传递给方法。
这是如何配合到事件模型?
呼叫:
myButton.OnClick += new .....();
是内部刚好路过的方法/函数的参数在事件发生时,所有的用户都收到该事件?
看看这个
好奇心是福
当你这样做:
myButton.OnClick += new ...();
你将你的委托作为一个用户到该事件。 当引发后来的情况下,所有的用户将被调用(不保证有关订单)。 这就是所谓的多播委托。 它有点像它允许“点”到一个以上功能的额外的奖励函数指针。
请注意,现在你不需要明确创建委托,你可以只使用方法名:
myButton.OnClick += MethodName;
而且不要忘记,你可以(也应该看到为什么 )从事件退订您订阅防止泄漏:
myButton.OnClick -= MethodName;
本次活动有两个运营商; 添加和删除。 当你(在你的例子作为)添加事件处理程序,该事件将得到该方法的引用,并将其添加到其订阅的事件处理程序的列表。 当引发事件,它会经过列表,并调用它的方法。
事实上, 委托很像一个函数指针。 第一个区别是,委托由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添加两个代表。 这也可以从一个多播委托删除的委托。 当被调用时,多播委托将调用其所有的儿童代表。 这可能会带动其他的问题,但我会从原来的问题被偏离。
一个事件 ,在另一方面,是一个完全不同的东西。 事实上,一个事件是特殊的访问器的属性。 普通属性有以下两个访问:get和set。 事件有两个替代: 添加和删除 。
add访问将结合目前的代表是与新的委托的情况下为多播委托。 remove访问却反其道而行之。
有了这一点,很容易理解为什么C#设计人员挑选了+ =和- =操作符。 我的意思是,下面的两行是有点相当于(如果你忽略了这一事实,第二)。
myButton.OnClick += newEventHandler;
myButton.OnClick = myButton.OnClick + newEventHandler;
本次活动,这在点击一个按钮的情况下是“点击”事件中,充当“函数指针”在这里。 意思是,当你使用+ =语法添加你的方法给它,你基本上做的Click函数指针指向你的函数。 因此,当单击按钮时,点击函数指针调用所有的功能,它的指向。 说得通?
事件是基于委托的属性。
它包装专用(和隐藏)代表成员。
按钮有一个私人“多播委托”字段和公共财产,如“点击”您使用+ =和 - =运营商是管理私有字段的状态自动生成方式。
当按钮内部引发Click事件,则调用私有多播委托,将调用,它目前所知道的所有代表。
该系统可以是混乱首先实现自己的活动的时候,因为相同的标识符,“事件名称”,指的是你的类中的一件事(私有多播委托场)和类之外的另一件事(公共管理机制,该场)。
一个“事件”是一个多播委托。 例如:
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编译器,标志着该成员的私人。
我同意所有这就是说,我只是想补充我的两分钱。
如果我要重新写的文档我要说,代表的是语言的指针和部分,而事件是一个框架,允许您使用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关于一般事件和比赛条件更多的数据。