寫給那些看不懂委托的同學


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 委托"


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM