【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);
        }
    }

 

  

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM