C# Action<T> 委托

简介:

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

介绍

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

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方法显示列表的内容
        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<int> 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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 委托是一种定义方法签名的类型。当实例化委托时,您可以将其实例与任何具有兼容签名的方法相关联。您可以通过委托实例调用...
    LH_晴阅读 1,892评论 0 3
  • 如题: C# func and action委托是什么? 1) 回答这个问题之前,我们需要了解什么是委托(英文 D...
    kevin201712阅读 389评论 0 0
  • 委托是C#重要特性之一,C#中很多特性都是建立在委托的基础之上。 什么是委托 委托也叫代理delegate,就是把...
    JunChow520阅读 8,410评论 2 7
  • C# 委托 委托是类型安全的类,它定义了返回类型和参数的类型,委托类可以包含一个或多个方法的引用。可以使用lamb...
    OctOcean阅读 1,418评论 0 4
  • 委托Delegate C#中的Delegate对应于C中的指针,但是又有所不同C中的指针既可以指向方法,又可以指向...
    沉麟阅读 736评论 0 0

友情链接更多精彩内容