C#零基礎學習理解委託

來源:互聯網
上載者:User

說來慚愧,在大學的課程中,竟然沒有聽說過委託這個名稱。那麼今天我就帶著大家一起探討下委託和事件。

咱們先來看下委託

我主要從以下幾個方面講解

1, 為什麼使用委託 2.什麼是委託 3.委託如何使用

為什麼使用委託?

委託是c#中非常重要的一個概念,使用委託使程式員可以將方法引用封裝在委派物件內。然後可以將該委派物件傳遞給可調用所引用方法的代碼,而不必在編譯時間知道將調用哪個方法。與C或C++中的函數指標不同,委託是物件導向,而且是型別安全的。

什麼是委託?

委託是一種引用方法的類型,一旦為委託分配了方法,委託將與該方法具有相同的行為,委託方法的使用和其他方法一樣,具有參數和傳回值。

如何使用委託

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

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

分析: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個案例,大家對委託有沒有一個相對清晰的認識,如果本文能協助迷途中的你,那就更好了。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.