我在很久以前读过一个问题"How do C# Events work behind the scenes?",Jon回答所有事件都与方法类似......
在一个纯粹假设的情况下,我想知道是否有人可以解释或指向一个资源,说明何时使用某个方法的事件?
基本上,如果我想要一个大的红色/绿色状态图片链接到Bool字段,并且我想根据bool的值更改它,我应该:
a)有一个名为Changepicture
的方法,它与字段相关联,并改变了布尔和图片的状态。
b)在该字段中设置一个get / set部分并在事件中添加一个事件。
c)在字段中有一个get / set部分,并在set部分中粘贴一个方法。
d)其他?
答案 0 :(得分:1)
要获取有关活动的更多信息,请参阅此post。
答案 1 :(得分:0)
你有选择。
如果你的对象已经实现了INotifyPropertyChanged
并且你的红色/绿色图片是支持数据绑定的控件,那么你可以简单地在bool的set方法上触发NotifyPropertyCHanged事件,并在该属性上添加一个数据绑定到你的控件。
如果没有实现INotifyPropertyChanged,我仍然会建议做类似的事情。即创建自己的事件处理程序,并使reg / green图片订阅该事件。直接从你的属性集中调用方法会产生紧耦合,这通常是一件坏事。
答案 2 :(得分:0)
答案是:这取决于。 如果您的布尔值在可视组件的代码隐藏类中(例如WinForm),则可以调用方法ChangePicture而不会做出奇怪的事情。但是如果您的布尔值是远离可视组件的架构,则事件是处理场景的正确方法,因为您无法轻松调用可视组件上的方法,因为包含布尔值的类可能甚至不知道您的可视组件存在。 :)
答案 3 :(得分:0)
了解应该做什么的最好方法是查看.NET框架中的类,看看它们是如何设计的。
方法是“实施者”或“行动”,而您可以将事件视为通知机制。也就是说,如果其他人可能感兴趣的是在某个对象中发生某些事情时会收到通知,那么您可以展示一个事件并让这些事件有一个或多个订阅者。
由于.NET中的事件是多播的,这意味着多个对象可以订阅并因此被通知事件发生,这可能是在对象中引发事件的其他原因。事件也遵循观察者模式,因为主体(您的类)实际上并不知道订阅者(松散耦合)。在调用方法时,辅助对象需要引用类的实例。
请注意,您班级中的方法最终会引发并发生事件。因此,假设您的类中有一个名为ChangePicture的方法。然后在方法的实现中,您最终可能会引发事件PictureChanged。如果有人有兴趣收到此活动的通知,他们可以订阅此活动。这个人通常不是那个让方法调用来改变图片的人。
活动是代表。代表是对象。事件实际上是MulticastDelegates(.NET框架中的基类)。这些对象最终调用一个方法,该方法作为事件通知的一部分被调用。所以它们稍微“重”,然后只是一个方法调用,但这几乎不会决定你的设计。