当前位置:首页 > Windows程序 > 正文

建议40:使用event关键字为委托施加保护

2021-03-27 Windows程序

建议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”中使用时除外)

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/68411.html