C# Action 委托

简介:

封装一个方法,该方法只有一个参数并且不返回值。可以使用 Action< T> 委托以参数形式传递方法,而不用显式声明自定义的委托。封装的方法必须与此委托定义的方法相对应。 即封装的方法必须具有一个通过值传递给它的参数,并且不能返回值。 Action 委托还可以多个参数传入。如果有返回值,则使用Fun

介绍

public delegate void Action( T obj )
类型参数 in T ---- 此委托封装的方法的参数类型。
参数 obj ------类型:T,此委托封装的方法的参数。

使用

在使用 Action< T> 委托时,不必显式定义一个封装只有一个参数的方法的委托。

  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 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 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 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> 委托作为参数。通过使用由委托封装的方法,可以对数组或列表中的每个元素执行操作。

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

6.测试使用

    public class TestAction 
    {
        public Action LoginTest; // 定义有一个参数的
         // 用来传参的
        pubilc void setAction(int account)
        {
            LoginTest(account);//传参
        }
    }
public class TestLoginUI : MonoBehaviour
{
    TestAction testAction = new TestAction();
    private void Awake()
    {
       testAction.LoginTest += LoginSuccess; //添加调用
    }
    void LoginSuccess(int index)
    {
        Debug.Log("登陆账号:"+ index);//执行
    }

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

参考链接:https://blog.csdn.net/C_gyl/article/details/102792825

你可能感兴趣的:(C# Action 委托)