C# 從1.x 發展到目前的 4.5,委托的寫法真是越來越簡單精悍。如果您對這些委托的寫法不是很清晰,本文可以幫助到您。
委托是一種安全封裝方法的類型,可以將方法作為方法的參數。
委派方法的參數個數、順序、類型及方法返回值類型必須跟定義的委托方法一樣,但參數名稱可以不同。
1、C# 定義一個完整委托:
delegate string SayMessage(string msg); static string SayHello(string Name) { return string.Format("Hello {0}", Name); } static void Main(string[] args) { SayMessage say = new SayMessage(SayHello); Console.WriteLine(say("委托")); Console.ReadKey(); }
輸出結果:"Hello 委托"
2、C#2.0后出現了匿名方法,可以將委托方法省略掉,直接給委托傳遞一個匿名方法,當然也要去掉New這個動作。
delegate string SayMessage(string msg); static void Main(string[] args) { SayMessage say = delegate(string Name) { return string.Format("Hello {0}", Name); }; Console.WriteLine(say("匿名方法")); Console.ReadKey(); }
輸出結果:"Hello 匿名方法"
3、 聰明的人們總是想使用更少的代碼達到相同的效果。因此C#3.0 之后出現了 Lambda表達式、Action委托、Func 委托
(1) Lambda表達式:匿名方法的升級版,可以簡化匿名方法的寫法。寫法 (形參列表)=>{ 表達式 OR 函數體 }
delegate string SayMessage(string msg); static void Main(string[] args) { SayMessage say = (Name) => { return string.Format("Hello {0}", Name); }; Console.WriteLine(say("Lambda")); Console.ReadKey(); }
輸出結果:"Hello Lambda"
通過看上面的代碼,能否將定義的委托 SayMessage 也去掉嗎?當然可以,用 Func委托 或者 Action委托 就可以取代它!
(2)Func 委托:當我們封裝一個具有返回值方法的時候就可以使用Func委托。
Func 委托一共有 15種重載,但總會有一個返回值,比如我們示例中用到的Func<T, TResult>委托就是其中之一。
Func<T, TResult>的作用就是 封裝一個具有一個T類型參數並返回 TResult 類型值參數的方法。
如果封裝方法沒有有輸入參數則直接使用Func<TResult> 委托。
static void Main(string[] args) { Func<string, string> say1 = delegate(string Name) { return string.Format("Hello {0}", Name); }; //和Lambda 結合 Func<string, string> say2 = (Name) => { return string.Format("Hello {0}", Name); }; Console.WriteLine(say1("Func 委托")); Console.WriteLine(say2("Func 委托")); Console.ReadKey(); }
輸出結果:"Hello Func 委托"
(3)Action委托:當我們封裝一個沒有返回參數的方法時,就可以使用Action委托。
Action委托也有 15種重載,封裝的方法可有有輸入參數,但不會有返回參數。
比如下面示例代碼中用到的Action<T>委托,其作用就是 封裝一個具有T類型參數且無返回值參數 的方法。
如果封裝方法沒有輸入參數則可以直接使用 Action 委托。
static void Main(string[] args) { Action<string> say1 = delegate(string Name) { Console.WriteLine(string.Format("Hello {0}", Name)); }; //和Lambda 結合 Action<string> say2 = (Name)=> { Console.WriteLine(string.Format("Hello {0}", Name)); }; say1("Action 委托"); say2("Action 委托"); Console.ReadKey(); }
輸出結果:"Hello Action 委托"