zoukankan      html  css  js  c++  java
  • 【转】编写高质量代码改善C#程序的157个建议——建议40:使用event关键字为委托施加保护

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

  • 相关阅读:
    jmeter之GUI运行原理
    jmeter之自定义java请求性能测试
    TestNG+ExtentReports生成超漂亮的测试报告(转)
    【测试设计】使用jenkins 插件Allure生成漂亮的自动化测试报告(转)
    Windows 清空剪切板
    android studio Warehouse(仓库配置)
    C/C++ string to int or int to string
    CNC FANUC define program
    CNC WEB
    CNC 法兰克加工中心CNC数控系统怎么修改程序
  • 原文地址:https://www.cnblogs.com/farmer-y/p/7943780.html
Copyright © 2011-2022 走看看