說來慚愧,在大學的課程中,竟然沒有聽說過委托這個名稱。那麼今天我就帶著大家一起探討下委托和事件。
咱們先來看下委托
我主要從以下幾個方面講解
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個案例,大家對委托有沒有一個相對清晰的認識,如果本文能幫助迷途中的你,那就更好了。