1. 程式人生 > >.NET委託,事件和Lambda表示式

.NET委託,事件和Lambda表示式

# 委託 ## 委託是什麼? 委託是一種引用型別(其實就是一個類,繼承MulticastDelegate特殊的類。),表示對具有特定引數列表和返回型別的方法的引用。 每個委託提供Invoke方法, BeginInvoke和EndInvoke非同步方法 ## 為什麼需要委託? * 委託可以將方法(即邏輯)作為引數; * 邏輯解耦,保持穩定。 * 程式碼複用,保證專案規範。 ## 如何使用委託? ### 如何宣告、例項化和使用委託 宣告委託 delegate void Del(string str); static void Notify(string name) { Console.WriteLine($"Notification received for: {name}"); } 例項化委託 Del del1 = new Del(Notify); //C# 2.0 Del del2 = Notify; 呼叫委託 del1.Invoke("小明"); del2("小明"); 其他使用委託 //C# 2.0使用匿名方法來宣告和例項化委託 Del del3 = delegate(string name) { Console.WriteLine($"Notification received for: {name}"); }; //C# 3.0使用lambda表示式宣告和例項化委託 Del del4 = name => { Console.WriteLine($"Notification received for: {name}"); }; 簡化開發過程,.NET 包含一組委託型別: * Action<> 具有引數且不返回值。 * Func<> 具有引數且返回由引數指定的型別的值。 * Predicate<> 用於確定引數是否滿足委託條件的情況。 ## 實際案例 程式碼: class Program { /// /// 宣告委託 /// /// private delegate void KillDelegate(string fullName); static void Main(string[] args) { //例項化委託 var killWithKnifeDelegate = new KillDelegate(KillWithKnife); Kill("郭靖", killWithKnifeDelegate); var killWithSwordDelegate = new KillDelegate(KillWithSword); Kill("黃蓉", killWithSwordDelegate); var killWithAxeDelegate = new KillDelegate(KillWithAxe); Kill("歐陽克", killWithAxeDelegate); Console.ReadKey(); } static void Kill(string fullName, KillDelegate killDelegate) { Console.WriteLine($"{fullName}遇到怪物"); //呼叫委託 killDelegate.Invoke(fullName); Console.WriteLine($"{fullName}增長10經驗"); } static void KillWithKnife(string fullName) { Console.WriteLine($"{fullName}用刀殺怪物"); } static void KillWithSword(string fullName) { Console.WriteLine($"{fullName}用劍殺怪物"); } static void KillWithAxe(string fullName) { Console.WriteLine($"{fullName}用斧殺怪物"); } } # Lambda表示式 ## Lambda是什麼? Lambda就是使用委託的更方便的語法。 //C# 2.0使用匿名方法來宣告和例項化委託 Del del3 = delegate(string name) { Console.WriteLine($"Notification received for: {name}"); }; //C# 3.0使用lambda表示式宣告和例項化委託 Del del4 = name => { Console.WriteLine($"Notification received for: {name}"); }; ## 為什麼需要Lambda? 簡化開發過程,並不會影響執行效能。 ## 如何使用Lambda? 表示式lambda基本形式: //僅當 lambda 只有一個輸入引數時,括號才是可選的;否則括號是必需的 (input-parameters) => expression 使用空括號指定零個輸入引數: Action line = () => Console.WriteLine(); 括號內的兩個或更多輸入引數使用逗號加以分隔: