zoukankan      html  css  js  c++  java
  • 【c# 学习笔记】为什么要使用委托

      上一章中我们可能会很疑惑,为什么需要委托?为什么不直接在MyMethod方法里直接调用Add方法,反而要实例化一个委托对象来完成调用呢?这岂不是自找麻烦吗?

      当然,c#引入委托并不是自找麻烦。委托是c#最好的一个特性,它为后来的很多特性都打下了基础。委托使得一个方法可以作为另一个方法的参数进行传递,这就是委托最大的作用。如下例子:

      例如我们要实现一个打招呼的方法,而每个国家打招呼的方式都不一样,刚开始我们可能会像下面这样实现打招呼的方法:

            public void Greeting(string name,string language)
            {
                switch (language)
                {
                    case "zh-cn":
                        ChineseGreeting(name);
                        break;
                    case "en-us":
                        EnglishGreeting(name);
                        break;
                    default:
                        EnglishGreeting(name);
                        break;
                }
            }
    
            public void EnglishGreeting(string name )
            {
                Console.WriteLine("Hello, " + name);
            }
    
            public void ChineseGreeting(string name)
            {
                Console.WriteLine("你好, " + name);
            }

      若后续我们需要添加德国、日本等打招呼方法,就必须修改Greeting方法内的case语句,来适应新的需求,这样特别不方便。有了委托,我们就可以把函数作为参数,并像如下代码实现Greeting方法:

      

            public delegate void GreetingDelegate(string name);
    
            static void Main(string[] args)
            {
                //引入委托
                Program p = new Program();
    
                p.Greeting("小叶", p.ChineseGreeting);
    
                p.Greeting("Tommy Li", p.EnglishGreeting);
    
                Console.Read();
    
            }
    
            public void Greeting(string name,GreetingDelegate callback)
            {
                callback(name);
            }
            public void EnglishGreeting(string name)
            {
                Console.WriteLine("Hello, " + name);
            }
    
            public void ChineseGreeting(string name)
            {
                Console.WriteLine("你好, " + name);
            }

      如下,增加德国人打招呼:

     

        class Program
        {
            public delegate void GreetingDelegate(string name);
    
            static void Main(string[] args)
            {
                //引入委托
                Program p = new Program();
    
                p.Greeting("小叶", p.ChineseGreeting);
    
                p.Greeting("Tommy Li", p.EnglishGreeting);
    
                p.Greeting("Ha Wa", p.GermanyGreeting);
    
                Console.Read();
    
            }
    
            public void Greeting(string name,GreetingDelegate callback)
            {
                callback(name);
            }
            public void EnglishGreeting(string name)
            {
                Console.WriteLine("Hello, " + name);
            }
    
            public void ChineseGreeting(string name)
            {
                Console.WriteLine("你好, " + name);
            }
    
            public void GermanyGreeting(string name)
            {
                Console.WriteLine("Hallo, " + name);
            }
        }

      

      

  • 相关阅读:
    Python all() 函数
    支付流程及安全测试(转载)
    qtp 自动化测试--点滴 菜单没有了,有些控件运行时找不到
    qtp 自动化测试---点滴 获取属性性/修改窗体标题
    点滴记录1-学习-问题-原因-解决方法
    测试职业规划 (转载)
    sql注入测试用例
    转载--测试员要想实现自己的职业发展目标,离不开这5点
    qtp 自动化测试--点滴 自定义显示工具菜单 trzedit
    QTP 自动化测试--定义变量
  • 原文地址:https://www.cnblogs.com/xiaoyehack/p/9647526.html
Copyright © 2011-2022 走看看