这个帖子不含任何有益内容,仅作为笔记使用,建议看其他大佬的文章
Delegate: 最通用的委托类型,可以引用任何具有相匹配签名的方法。它提供了最大的灵活性,适 用于需要传递任意方法的情况
Action: 用于表示没有参数和返回值的方法的委托。它提供了一种简洁的方式来表示无参数无返 回值的操作,通常用于触发事件或执行简单的操作。
Func: 用于表示具有返回值的方法的委托。与Action不同,Func允许指定返回类型,并支持具有一 个或多个参数的方法。它常用于需要进行计算、转换等操作并返回结果的情况。
EventHandler: 专门用于处理事件的委托类型。它接收两个参数:事件的发起者和事件参数,用于 处理事件的方法。
委托类型(Event、Action、Func、EventHandler)都是基于委托(Delegate)的不同变体实现
-
Event: 本质上是一种特殊的多播委托(Multicast Delegate),用于触发和订阅事件。它封装了委托的概念,并提供了更强大的事件处理机制。
-
Action: Action 是委托的一种封装,它专门用于表示没有参数和返回值的方法的委托。虽然它的底层实现仍然是委托,但它提供了更清晰、更简洁的语法来表示这种类型的方法。
-
Func: Func 也是委托的一种封装,它用于表示具有返回值的方法的委托。与 Action 类似,它提供了一种简洁的方式来表示具有返回值的方法。
-
EventHandler: 作为.NET Framework 中事件处理的标准委托类型,EventHandler 也是委托的一种特殊形式。它专门用于处理事件,并规定了接收两个参数(事件的发起者和事件参数)的委托签名。
关于EventHandler
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TesT2024v2v1
{
class Class1//这个是EventHandler都会传入的一个参数
{
public string C1 = "测试";
}
// 主程序入口
class A
{
//EventHandler类似于Action 但不同的是它挂载的方法都会传入两个参数,第一个
//一般是调用类的对象,令一个一般是特定的参数对象里面装着一堆通用的数据
public static event EventHandler<Class1> XXXX; //EventArgs.Empty 如果不像传入参数就吧这里的<Class1删去>
//Invoke里的YYYY改成EventArgs.Empty
public static Class1 YYYY; //A1方法里的Class b 改成 System.EventArgs e
static void Main(string[] args)
{
YYYY = new Class1();
XXXX += A1;//这里加入一个方法(加入里面的方法都要满足EventHandler的参数列表)
XXXX?.Invoke(null,YYYY);//调用XXXX里的方法
}
public static void A1(object a,Class1 b )
{
Console.WriteLine(b.C1);
}
}
}
关于 Delegate Action Func
using System;
using System.Diagnostics;
public class Player
{
public string Name = "你好";
delegate void A1(int i);//声明了一个会接受一个int的委托的类型注意是类型,不是变量
delegate void A2();
static void Main()
{
AAA aAA = new AAA();
A1 a1 = P1;//输入了一个P1方法,注意参数P1的参数列表和A1是一样的,此时它仍是一个变量
a1(666);//调用委托
//在 C# 中,Action、Func 和 delegate 都是委托(delegate)的不同形式。
//Delegate(委托)是一种类型,用于引用方法。它允许将方法作为参数传递给其他方法,或者存储对方法的引用,且参数和返回值是固定的。
//Action 是一个泛型委托,它表示一个没有返回值的方法。它可以接受0到16个输入参数,且参数和返回值可变。
//Func 也是一个泛型委托,它表示一个具有返回值的方法。它可以接受0到16个输入参数,且参数和返回值可变,最后一个参数表示方法的返回值。
Action<int> AC2 = P2;
AC2(777);
Func<int, string> AC3 = P3;
Console.WriteLine(AC3(666));
//委托在仅仅只是引用一个方法,这意味着委托运行时仍是在原来的类内运行的
A2 a2 = aAA.A1;
a2();
}
public static void P1(int i)
{
Console.WriteLine("这里是P1方法" + i);
}
public static void P2(int A)
{
Console.WriteLine("这里是P2接收了" + A);
}
public static String P3(int a)
{
return "这里是p3接收了" + a.ToString();
}
}
public class AAA
{
public String name = "这里是AAA的变量";
public void A1()
{
Console.WriteLine("这里是A1方法" + name);
}
}
/
/