.NET委托是否用于事件?
我有点困惑,我知道委托就像函数指针一样,它们用于将函数作为参数传递给方法。
这如何适合事件模型?
呼叫:
myButton.OnClick += new .....();
在事件发生时,内部只是将方法/函数作为参数传递,并且所有订阅者都会收到有关该事件的通知吗?
看看这个
好奇心是幸福
当你这样做时:
myButton.OnClick += new ...();
您正在将您的代理添加为该事件的订阅者。 稍后提出事件时,将调用所有订阅者(不保证订单)。 这称为多播委托。 它有点像一个函数指针,可以让它“指向”多个函数。
请注意,现在您不需要显式创建委托,您只需使用方法名称:
myButton.OnClick += MethodName;
并且不要忘记您可以(并且应该, 为什么 )取消订阅您订阅的事件以防止泄漏:
myButton.OnClick -= MethodName;
该活动有两个运营商; 添加和删除。 添加事件处理程序时(如示例所示),事件将获取对该方法的引用,并将其添加到其订阅事件处理程序列表中。 引发事件时,它将遍历列表并调用其中的方法。
实际上, 委托就像一个函数指针。 第一个区别是委托由2个“指针”组成:函数指针和实例指针。 毫不奇怪,Delegate类有以下两个属性:
// 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访问器将事件中的当前委托与新委托合并为多播委托。 删除访问器将执行相反的操作。
考虑到这一点,很容易理解为什么C#设计师选择了+ =和– =运算符。 我的意思是以下两行在某种程度上是等价的(如果你忽略了第二行)。
myButton.OnClick += newEventHandler; myButton.OnClick = myButton.OnClick + newEventHandler;
该事件,在按钮Click的情况下是“Click”事件,在此处充当“函数指针”。 这意味着,当您使用+ =语法向其添加方法时,您实际上是将Click Function Pointer POINT设置为您的函数。 因此,单击该按钮时,Click Function指针会调用其指向的所有函数。 说得通?
事件是基于委托的属性。
它包装了一个私有(和隐藏)委托成员。
Button具有私有的“多播委托”字段,并且使用+ =和 – =运算符的公共属性(如“Click”)是一种自动生成的方式来管理该私有字段的状态。
当按钮在内部引发click事件时,它正在调用该私有多播委托,它将调用它当前知道的所有委托。
首次实现您自己的事件时,此系统可能会造成混淆,因为相同的标识符“EventName”指的是您的类中的一个内容(私有多播委托字段)和类外的另一个内容(该字段的公共管理机制) )。
“事件”是多播委托。 例如:
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-event-and-messaging-pump的工具。 当您尝试在ASP.NET下使用EVENTS并需要等待事件时,您会注意到这一点。 (更多信息http://discuss.joelonsoftware.com/default.asp?joel.3.456478.15 )我的问题是MultiCast代理是介于两者之间的版本,所以更难区分和清除它们。
delegate是一个指向函数的指针MultiCastdelegate是一个名称下聚合的委托列表
event是一个修饰符,它以不同的方式执行一些操作1.在调用者的ThreadContext下运行(请参阅BackgroundWorker和AsyncOperationManager)。 2.事件可以添加到接口(澄清OO连接)
委托1.在监听器2的上下文中运行。不能添加到接口
阅读http://blogs.msdn.com/b/jaybaz_ms/archive/2004/06/17/158636.aspx ,了解有关事件和竞争条件的更多数据。