# C#委托 太久沒用了,簡單的複習一下 快速過一遍語法使用 ## 使用委托的步驟 1.定義一個委托類型 只需要在聲明的前面加上delegate關鍵字,其他的就跟聲明一個方法(函數)類似 ~~~ public delegate void SayHello(string name); ~~~ 2.使用 ...
C#委托
太久沒用了,簡單的複習一下
快速過一遍語法使用
使用委托的步驟
1.定義一個委托類型
只需要在聲明的前面加上delegate關鍵字,其他的就跟聲明一個方法(函數)類似
public delegate void SayHello(string name);
2.使用剛剛聲明的委托
需要定義一個返回值跟參數與我們剛剛定義的委托一致
public static void MyFunc(string name)
{
Console.WriteLine($"Hello {name}");
}
3.然後聲明一個SayHello類型(委托)的變數
把前面定義的方法賦值給變數
然後就可以使用委托像正常調用MyFunc一樣使用該方法
SayHello say = MyFunc;
//調用委托
say("Tom");
//進入MyFunc輸出 "Hello Tom"
也可以使用Lambda表達式給委托賦值
SayHello say = (string name)=> {
Console.WriteLine($"Hello {name}");
};
SayHello say = name=> {
Console.WriteLine($"Hello {name}");
};
效果都是一樣的
委托也可以定義為泛型,除了delegate其他都與聲明方法(函數)無異
public delegate bool Compare<T1,T2>(T1 t1,T2 t2);
二
對委托最常使用的方法是 Invoke() 和 BeginInvoke() / EndInvoke()
Invoke() 會調用賦值給委托的所有方法
直接調用也是全部方法都調用say()
要註意的是除了第一次賦值其他都要用+=的方式賦值,否則後面的會覆蓋掉前面的
最終結果輸出 "不想打招呼"
//第一次賦值
SayHello say = name => {
Console.WriteLine($"你好 {name}");
};
//還是用 = 號賦值
say = MyFunc;
say = _ => {
Console.WriteLine("不想打招呼");
};
say("Tom");
//say.Invoke("Tom");
最終輸出 :
{
你好 Tom
Hello Tom
不想打招
}
//第一次賦值
SayHello say = name => {
Console.WriteLine($"你好 {name}");
};
say += MyFunc;
say += _ => {
Console.WriteLine("不想打招呼");
};
say("Tom");
//say.Invoke("Tom");
還有就是可以使用 -= 移除方法
SayHello say = name => {
Console.WriteLine($"你好 {name}");
};
say += MyFunc;
say += _ => {
Console.WriteLine("不想打招呼");
};
//移除MyFunc,這樣最後就不會輸出 Hello Tom 了
say-=MyFunc;
say("Tom");
官方提供的定義好的委托
1.Action:沒有返回值,返回值為void
2.Func:有返回值,泛型的最後一個參數為返回值類型,
比如:Func<string,int> 或 Func
3.Predicate 返回值為 bool
事件 Event
事件是跟委托結合使用的,事件基於委托,而且是多播委托
定義一個事件的語法就是 event +委托(定義好的委托)+變數名(隨便取,不過最好規範點)
public event SayHello OnSayHello;
和委托不一樣事件只能通過+= 和 -= 添加和移除方法
所有添加(訂閱了OnSayHello)的方法在事件調用(觸發)的時候都會收到通知,
也就是被調用
OnSayHello += Program_OnSayHello;
OnSayHello += s => {
Console.WriteLine($"張三聽到有人在叫{s}");
};
OnSayHello += _ => { Console.WriteLine("有人在招呼?"); };
//OnSayHello("Tom");
OnSayHello.Invoke("Tom");
private static void Program_OnSayHello(string name)
{
Console.WriteLine($"有人在跟{name}招呼");
}
//最終輸出
有人在跟Tom招呼
張三聽到有人在叫Tom
有人在招呼?
區別委托和事件
我們發現委托跟事件 好像很像,但還是要根據不同的情況選擇。
更多
C#委托和事件之間的區別如下:
-
委托是一個包含一個或多個方法引用的對象,它可以在程式中傳遞和調用方法。而事件是一個特殊類型的委托,它只能在定義它的類中觸發,並且它通常用於實現觀察者模式。
-
委托可以在程式中的任何地方調用,而事件只能在定義事件的類中觸發。
-
委托可以被任何方法調用,而事件只能由一個或多個特定的方法註冊和調用。
-
委托可以使用“+”和“-”運算符來添加和移除方法,而事件只能使用“+=”和“-=”運算符來添加和移除事件處理程式。
-
委托可以直接調用方法,而事件必須在事件處理程式中被觸發。