C# 委托Delegate(一) 基礎介紹&用法


本文是根據書本&網絡 前人總結的。

 

1. 前言

定義&介紹:

委托Delegate是一個類,定義了方法的類型, 使得可以將方法當做另一個方法的參數來進行傳遞,這種將方法動態地賦給參數的做法,可以避免在程序中大佬使用If-Else(Switch)語句,同時使得程序具有更好的可擴展性

我們知道委托是一個引用類型,所以它具有引用類型所具有的通性。它保存的不是實際值,而是保存對存儲在托管堆(managed heap)的對象的引用。那它保存的是對什么的引用呢?它保存的是對函數(function)的引用。

首先要知道什么是委托,用最通俗易懂的話來講,你就可以把委托看成是用來執行方法(函數)的一個東西。

委托類:

當我們用delegate關鍵字聲明委托時,編譯器自動為我們生成類。類的名字即為委托變量名,訪問類型為定義的委托訪問類型。如public delegate void CallBack(string name, int number);定義的委托對應的類為CallBack,訪問類型為public,該類繼承自[mscorlib]System.MulticastDelegate。如果我們定義委托的訪問類型為private或者protected,則對應的委托類的訪問類型為private或者protected。但是任何委托都繼承自[mscorlib]System.MulticastDelegate。

 

2. 委托演變代碼

1)我們創建一個類LanguageSpeak,多國說的語言,包括中文、英文、法文。與語言枚舉,如下

    public enum Language
    {
        English, Chinese, Frank
    }

    public class LanguageSpeak
    {
        private void SpeakChinese(string name)
        {
            Console.WriteLine(name + " speak Chinese");
        }

        private void SpeakEnglish(string name)
        {
            Console.WriteLine(name + " speak English");
        }

        private void SpeakFrench(string name)
        {
            Console.WriteLine(name + " speak French");
        }       

    }

現在,我們在類LanguageSpeak添加個方法,用來讓不同人選擇不同的語言。

傳入名字、語言。

        public void SpeakLanguage(string name, Language language)
        {
            switch (language)
            {
             case Language.Chinese:
                    SpeakChinese(name);
                    break;
             case Language.English:
                    SpeakEnglish(name);
                    break;
             case Language.Frank:
                    SpeakFrench(name);
                    break;
            }
        }

最后我們,在調用語言,達到不同人說不同語言的目的。

              LanguageSpeak languageSpeak = new LanguageSpeak();
            languageSpeak.SpeakLanguage("陳桃", Language.Chinese);
            languageSpeak.SpeakLanguage("Allen", Language.English);
            languageSpeak.SpeakLanguage("Delavenay", Language.Frank);

 

2)現在我們來看看,如果增加一種語言,比如粵語,要在語言類LanguageSpeak中添加一個方法,也要在SpeakLanguage方法與枚舉中添加相應的語言判斷。這樣擴展性很差,現在,我們轉變一種思維,用delegate委托的方式實現我們想要的結果。

使用委托,枚舉也不用了,看看以下要改變的代表是不是變得靈活性更加高了。

第一步,在LanguageSpeak類添加委托聲明

public delegate void SpeakLanguageDelegate(string name);

第二步,把方法

public void SpeakLanguage(string name, Language language)

改成

        public void SpeakLanguage(string name, SpeakLanguageDelegate speakLanguageDelegate)
        {
            speakLanguageDelegate(name);
        }

最后,我們開始調用

              LanguageSpeak languageSpeak = new LanguageSpeak();
            languageSpeak.SpeakLanguage("陳桃", languageSpeak.SpeakChinese);
            languageSpeak.SpeakLanguage("Allen", languageSpeak.SpeakEnglish);
            languageSpeak.SpeakLanguage("Orvde", languageSpeak.SpeakFrench);

 

至此,我們看看,如果再增加一個國家語言,則在LanguageSpeak類中添加相應的方法,其他什么都不用改,也沒有switch的判斷。這就是delegate委托的魔性。

 

下一節,我們更加深入的理解委托

 

可以關注本人的公眾號,多年經驗的原創文章共享給大家。


免責聲明!

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



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