C#委託零基礎理解

 

C#委託零基礎理解(轉)html

1,  爲何使用委託  2.什麼是委託  3.委託如何使用 程序員

爲何使用委託? c#

委託是c#中很是重要的一個概念,使用委託使程序員能夠將方法引用封裝在委託對象內。而後能夠將該委託對象傳遞給可調用所引用方法的代碼,而沒必要在編譯時知道將調用哪一個方法。與C或C++中的函數指針不一樣,委託是面向對象,並且是類型安全的。 安全

什麼是委託? 函數

委託是一種引用方法的類型,一旦爲委託分配了方法,委託將與該方法具備相同的行爲,委託方法的使用和其餘方法同樣,具備參數和返回值。 this

如何使用委託 翻譯

下面我們就拋開枯燥的概念,來看幾個活生生的例子是怎麼使用委託的吧! 指針

案例1:中國人和英國人問好 htm

分析:1.首先咱們須要編寫一箇中國人問好的方法和一個英國人問好的方法。 對象

       2.編寫一個Greet方法,將問好方法做爲一個參數,實現各個國家人的問好方法。

       3.使用委託實現各個國家人的問好功能

  使用委託分爲三個步驟:1,定義委託  2.聲明委託變量  3.使用委託

      // 1.定義委託

       public delegate void GreetDelegate(string name);

      class Program

    {

        static void Main(string[] args)

        {

                     //2.聲明委託變量

GreetDelegate dDelegate = new GreetDelegate(ChineseGreeting);

//3.使用委託

            dDelegate("李小龍");

            Console.ReadKey();

        }

//中國人問好方法

        public static void ChineseGreeting(string name)

        {

            Console.WriteLine("早上好!" + name);

        }

        //英國人問好方法

        public static void EnglishGreeting(string name)

        {

            Console.WriteLine("Morning!" + name);

        }

        public static void Greet(string name, GreetDelegate makeGreet)

        {

            makeGreet(name);

        }

  }

爲了加深你們對委託的理解,咱們再來寫一個類似的例子。

案例2:翻譯案例:經過委託將英文翻譯爲中文和韓文

//01.聲明一個委託類

public delegate void MyTransDelegate(string words);

class Program

    {

        static void Main(string[] args)

        {

            //翻譯方法

            //調用方法一

            //2.聲明委託

            MyTransDelegate del=new MyTransDelegate(TransToCN);

            //3.調用委託

            del("aa");

//調用方法二

            Translate("aa",TransToCN);

            //調用方式三

            //MyTransDelegate del = TransToCN;

            //del("aa");

             Console.ReadKey();

        }

static  void Translate(string str,MyTransDelegate del)

        {

            del(str);

        }

        static void TransToCN(string str)

        {

            Console.WriteLine("翻譯成中文了!");

        }

        static void TransToKorean(string str)

        {

            Console.WriteLine("翻譯成韓語了!");

        }

}

經過這個案例,咱們能夠看出使用委託的方法不止一種,不管使用哪一種方式,最終都和方式一同樣。經過反編譯咱們能夠證實:

以下圖示我經過反編譯看到方法二的代碼:

以下是反編譯後方法三的代碼

有了上述知識存儲,咱們再來看一個案例:

案例3:經過委託將子窗體中的值傳遞到父窗體中

如圖有父窗體和子窗體兩個窗體,如今我想實現當點擊父窗體中按鈕時彈出子窗體(固然這個超級簡單),在彈出子窗體後,在子窗體的文本框中輸入內容,點擊關閉按鈕後子窗體關閉,而且將子窗體中輸入的內容在父窗體的文本框中顯示。

子窗體中代碼以下:

//定義委託

        public delegate void Words(string words);

        //聲明委託變量

        public Words words;

        private void button1_Click(object sender, EventArgs e)

        {

            words(txtchild.Text);

            this.Close();

        }

父窗體中的代碼:

private void btnOpen_Click(object sender, EventArgs e)

        {

            Child child = new Child();

            child.words = GetWords;

            child.Show();

        }

        public void GetWords(string str)

        {

            txtMain.Text = str;

        }

咱們來分析下上述兩斷代碼:

首先,咱們想在子窗體關閉時,更新父窗體文本框中的數據。可是咱們很是清楚的知道,窗體之間的空間是不能直接相互訪問的,這時咱們就要找一箇中介幫咱們實現父窗體數據的更新功能。因而咱們定義了帶一個參數沒有返回值的委託Words,而且在父窗體中定義了一個方法GetWords符合委託的條件。於此同時,在子窗體中聲明瞭一個委託變量words,而且在關閉按鈕中,調用了委託變量。

但在子窗體中咱們沒有對子窗體委託變量賦值,真正的賦值放到了主窗體中。這樣經過委託就實現了在子窗體中調用父窗體的方法,進而實現了父窗體文本框內容的更新。

   不知道,看過上述3個案例,你們對委託有沒有一個相對清晰的認識,若是本文能幫助迷途中的你,那就更好了。

相關文章
相關標籤/搜索