C# Action<T> 委托

簡介:

封裝一個方法,該方法只有一個參數(shù)并且不返回值??梢允褂?Action< T> 委托以參數(shù)形式傳遞方法,而不用顯式聲明自定義的委托。封裝的方法必須與此委托定義的方法相對應(yīng)。 即封裝的方法必須具有一個通過值傳遞給它的參數(shù),并且不能返回值。 Action<T1,T2 ......> 委托還可以多個參數(shù)傳入。如果有返回值,則使用Fun<T, TResult>。

介紹

public delegate void Action<in T>( T obj )
類型參數(shù) in T ---- 此委托封裝的方法的參數(shù)類型。
參數(shù) obj ------類型:T,此委托封裝的方法的參數(shù)。

使用

在使用 Action< T> 委托時,不必顯式定義一個封裝只有一個參數(shù)的方法的委托。

  1. 聲明了一個名為 DisplayMessage 的委托,并將對 WriteLine 方法或 ShowWindowsMessage 方法的引用分配給其委托實例。
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);      
   }
}

2.實例化 Action< T> 委托,而不是顯式定義一個新委托并將命名方法分配給該委托。

using System;
using System.Windows.Forms;
 
public class TestAction1
{
   public static void Main()
   { 
      //實例化Action委托
      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);      
   }
}

3.Action< T> 委托與匿名方法一起使用。

using System;
using System.Windows.Forms;
 
public class TestAnonMethod
{
   public static void Main()
   {
      //實例化Action委托
      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);      
   }
}

4.lambda 表達式分配給 Action< T> 委托實例。

using System;
using System.Windows.Forms;
 
public class TestLambdaExpression
{
   public static void Main()
   {
      //實例化委托
      Action<string> messageTarget; 
 
      //通過lambda表達式分配給委托
      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);      
   }
}

5.ForEach 和 ForEach< T> 方法都采用Action< T> 委托作為參數(shù)。通過使用由委托封裝的方法,可以對數(shù)組或列表中的每個元素執(zhí)行操作。

using System;
using System.Collections.Generic;
 
class Program
{
    static void Main()
    {
        List<String> names = new List<String>();
        names.Add("Bruce");
        names.Add("Alfred");
        names.Add("Tim");
        names.Add("Richard");
 
        // 使用Print方法顯示列表的內(nèi)容
        names.ForEach(Print);
 
        // 通過匿名方法顯示列表的內(nèi)容
        names.ForEach(delegate(String name)
        {
            Console.WriteLine(name);
        });
    }
 
    private static void Print(string s)
    {
        Console.WriteLine(s);
    }
}

6.測試使用

    public class TestAction 
    {
        public Action<int> LoginTest; // 定義有一個參數(shù)的
         // 用來傳參的
        pubilc void setAction(int account)
        {
            LoginTest(account);//傳參
        }
    }
public class TestLoginUI : MonoBehaviour
{
    TestAction testAction = new TestAction();
    private void Awake()
    {
       testAction.LoginTest += LoginSuccess; //添加調(diào)用
    }
    void LoginSuccess(int index)
    {
        Debug.Log("登陸賬號:"+ index);//執(zhí)行
    }

     private void OnDisable()
    {
         testAction.LoginTest -= LoginSuccess;//去掉
    }
}

參考鏈接:https://blog.csdn.net/C_gyl/article/details/102792825

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容