Action 委托使用詳解


Action<T> 委托其實與[button url="http://redcat7.net/?p=343" style="dark"]Func<T, TResult> 委托[/button]一樣,都是為了簡化委托的使用,這兩者的不同之處在於Action<T> 封裝一個方法且該方法只有一個參數並且不返回值,而Func<T, TResult>封裝一個具有一個參數並返回 TResult 參數指定的類型值的方法。

使用 Action<T> 委托以參數形式傳遞方法,不用顯式聲明自定義的委托。 封裝的方法必須與此委托定義的方法簽名相對應。 也就是說,封裝的方法必須具有一個通過值傳遞給它的參數,並且不能返回值。 (在 C# 中,該方法必須返回 void。 在 Visual Basic 中,必須通過 Sub…End Sub 結構來定義它。 它也可以是返回已忽略的值的方法。) 通常,這種方法用於執行某個操作。

那么Action<T>是如何簡化委托調用的呢?

請先看委托傳統的使用方法:

using System;
using System.Windows.Forms;

delegate void DisplayMessage(string message);

public class TestCustomDelegate
{
   public static void Main()
   {
      DisplayMessage messageTarget; 

      if (Environment.GetCommandLineArgs().Length > 1)
         messageTarget = ShowWindowsMessage;
      else
         messageTarget = Console.WriteLine;

      messageTarget("Hello, World!");   
   }      

   private static void ShowWindowsMessage(string message)
   {
      MessageBox.Show(message);      
   }
}

上面的代碼顯式聲明了一個名為 DisplayMessage 的委托,並將對 WriteLine 方法或 ShowWindowsMessage 方法的引用分配給其委托實例。

以下示例簡化了此代碼,它所用的方法是實例化 Action<T> 委托,而不是顯式定義一個新委托並將命名方法分配給該委托。

using System;
using System.Windows.Forms;

public class TestAction1
{
   public static void Main()
   {
      Action<string> messageTarget; 

      if (Environment.GetCommandLineArgs().Length > 1)
         messageTarget = ShowWindowsMessage;
      else
         messageTarget = Console.WriteLine;

      messageTarget("Hello, World!");   
   }      

   private static void ShowWindowsMessage(string message)
   {
      MessageBox.Show(message);      
   }
}

由此我們可以看出,通過使用Action<T> ,我們完美避開了對委托的定義,但缺點是它只接受一個參數,好在這個參數可以是任意類型,如果我們有多個參數需要傳遞,而又不想定義委托,那么我們可以新建一個對象類來封裝我們的參數,以滿足Action<T>對參數的要求。

Action<T>除了以上用法之外,還可以通過下面兩種方法來達到相同的目的,但是沒有上面的方法簡單。

1. 我們也可以按照以下示例所演示的那樣在 C# 中將 Action<T> 委托與匿名方法一起使用。

using System;
using System.Windows.Forms;

public class TestAnonMethod
{
   public static void Main()
   {
      Action<string> messageTarget; 

      if (Environment.GetCommandLineArgs().Length > 1)
         messageTarget = delegate(string s) { ShowWindowsMessage(s); };
      else
         messageTarget = delegate(string s) { Console.WriteLine(s); };

      messageTarget("Hello, World!");
   }

   private static void ShowWindowsMessage(string message)
   {
      MessageBox.Show(message);      
   }
}

2. 我們還可以按照以下示例所演示的那樣將 lambda 表達式分配給 Action<T> 委托實例。

using System;
using System.Windows.Forms;

public class TestLambdaExpression
{
   public static void Main()
   {
      Action<string> messageTarget; 

      if (Environment.GetCommandLineArgs().Length > 1)
         messageTarget = s => ShowWindowsMessage(s); 
      else
         messageTarget = s => Console.WriteLine(s);

      messageTarget("Hello, World!");
   }

   private static void ShowWindowsMessage(string message)
   {
      MessageBox.Show(message);      
   }
}

完。


免責聲明!

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



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