c# – 使事件符合Net准则有什么好处?
我了解如何根据Net Framework指南使用事件,但使用此模式有什么好处?
http://msdn.microsoft.com/en-us/library/aa645739%28VS.71%29.aspx:
a)我看到使用“对象源”值作为第一个参数的一些好处,因为有些情况下多个对象可以将它们的事件设置为相同的方法.因此,例如,如果我们有10个对象,并且如果所有10个对象将它们的事件设置为事件处理程序M,那么在M内部我们可以使用“object sender”参数值来标识事件调用的发起者. >但据我所知,“对象源”参数仅在事件方法中引发事件时才有用.因此,如果在静态方法中引发了事件,那么“对象源”参数是没有用的?! b)根据Net Framework准则使用事件是否还有其他好处? c)无论可能带来什么好处,为什么他们会超越必须的麻烦 >编写一个额外的代码,将所需的参数放入从EventArgs派生的对象中 谢谢 解决方法
据我所知,有两个主要好处:
>编写消耗该事件的代码的人将识别该模式并立即知道如何使用该事件 第一点应该是非常明显的,不需要太多详细说明. 至于第二点,有两个原因(在我看来).首先,由于发送者是对象,因此事件签名可以由几种类型重用.其次,由于第二个参数是EventArgs的后代,当您引入自己的EventArgs类时,可以在以后扩展此类,而不会更改事件的签名. 更新
我们举一个例子,参加以下课程: public class SomeClass { public event EventHandler<FileEventArgs> SomethingHappened; } public class FileEventArgs : EventArgs { public FileEventArgs(string filename) { Filename = filename; } public string Filename { get; private set; } } 然后我们有一个听取SomethingHappened事件的消费者: static void SomethingHappenedHandler(object sender,FileEventArgs e) { // do something intelligent } 现在,假设我们想要扩展我们在事件中传输的信息,并提供有关文件发生的信息: public enum WhatHappened { Copy,Rename,Delete } public class FileEventArgs : EventArgs { public FileEventArgs(string filename,WhatHappened whatHappened) { Filename = filename; WhatHappened = whatHappened; } public string Filename { get; private set; } public WhatHappened WhatHappened { get; private set; } } 现在,如果我们选择在事件本身中将文件名作为参数发送,我们需要通过添加另一个参数来更改事件签名,从而有效地破坏所有侦听事件的代码.但由于我们在上面的代码中只是简单地向FileEventArgsclass添加了另一个属性,因此签名保持不变,并且不需要更新任何侦听器(除非他们想要使用新添加的属性,即).
对,那是正确的.我通常传递null作为静态事件的发送者参数(老实说,这是非常罕见的). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- iphone – 适用于iOS 5.1的xcode 4.3安装
- React Native 安装apk的问题
- swift – Xcode 8.2中的xib文件无法正常工作.这是一个错误吗
- ruby-on-rails – 在rails 4中混淆autoload_paths和eager_l
- c – 从Derived *转换为Base *&
- 如何使用PowerShell更改XML Element属性的值?
- c# – 使用HttpClient异步NancyFX – fbcdn的GetAsync返回4
- backup – pg_dump压缩;服务器或客户端
- 从真实项目中抠出来的设计模式——第三篇:责任链模式
- 利用Oracle动态游标实现动态SQL循环遍历