码迷,mamicode.com
首页 > Windows程序 > 详细

编写高质量代码改善C#程序的157个建议——建议40:使用event关键字为委托施加保护

时间:2015-08-15 21:18:18      阅读:131      评论:0      收藏:0      [点我收藏+]

标签:

建议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个建议》陆敏技

编写高质量代码改善C#程序的157个建议——建议40:使用event关键字为委托施加保护

标签:

原文地址:http://www.cnblogs.com/jesselzj/p/4733018.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!