建议40:使用event关键字为委托施加保护
来源:互联网 发布:华尔街工资知乎 编辑:程序博客网 时间:2024/05/20 23:07
建议40:使用event关键字为委托施加保护
在建议中我们实现了一个具有通知功能的文件传输类,如下:
class FileUploader { public delegate void FileUploadedHandler(int progress); public FileUploadedHandler FileUploaded; public void Upload() { int fileProgress = 100; while (fileProgress > 0) { //传输代码,省略 fileProgress--; if (FileUploaded != null) { FileUploaded(fileProgress); } } } }
像这样调用:
static void Main(string[] args) { FileUploader f1=new FileUploader(); f1.FileUploaded = Progress; f1.FileUploaded = ProgressAnother; f1.Upload(); Console.Read(); } static void Progress(int progress) { Console.WriteLine(progress); } static void ProgressAnother(int progress) { Console.WriteLine("另一个方法:{0}", progress); }
以上调用者代码本身是和FileUploader类一起的,这起码存在两个问题:
1)如果在Main中另起一个线程,该工作线程则可以将FileProgress委托链置为空:
f1.FileUploaded = null;
2)可以在外部调用FileUploaded,如:
f1.FileUploaded(10) ;
这应该是不允许的,因为什么时候通知调用者,应该是FileUploader类自己的职责,而不是调用者本身来决定的。event关键字正是在这种情况下被提出来的,它为委托加了保护。
将
public FileUploadedHandler FileUploaded;
改为:
public event FileUploadedHandler FileUploaded;
这样,上面提到的几种情况就会被阻止:
f1.FileUploaded = null;f1.FileUploaded = Progress;f1.FileUploaded = ProgressAnother;
以上代码将编译不通过:
事件“MyTest.FileUploader.FileUploaded”只能出现在 += 或 -= 的左边(从类型“MyTest.FileUploader”中使用时除外)
转自:《编写高质量代码改善C#程序的157个建议》陆敏技
1 0
- 建议40:使用event关键字为委托施加保护
- C#中的代理委托和event关键字
- 匿名委托——为事件(event)注册匿名委托
- 为保护眼睛,建议电脑屏幕改为淡绿色
- 建议36:使用FCL中的委托声明
- 使用final关键字保护成员变量
- 基础篇.委托,event
- 软件保护建议
- 软件保护建议
- C#的event关键字
- event关键字的作用
- 事件(event)与委托(delegate)
- 委托(delegate)和事件(event)
- Delegate委托 和 Event事件
- C#事件(event) 解析委托
- C#学习笔记-委托,event
- C# delegate 委托 event 事件
- jquery event.target 事件委托
- 将搜索二叉树转换成双向链表
- 图与图算法在实际中的应用
- DB,Cache和Redis应用场景分析
- 不定宽高的水平和竖直同时居中
- Weka源码开发01——初识Weka及其源码开发
- 建议40:使用event关键字为委托施加保护
- VS2010/MFC编程入门之五十四(Ribbon界面开发:使用更多控件并为控件添加消息处理函数)
- crontab格式的CPP解析代码段
- ListVIew点击事件失效
- LTE中基于SR的调度传输
- 小练习——杨辉三角
- LibTest
- Java中栈内存、堆内存、方法区——浅析
- (第三章 10)“代码段间跳转” 和 “访问数据段”