3.10C#引用类型之委托(Delegate)

委托类型派生自 System.Delegate 类。

1.委托声明

委托 表示对具有 特定参数列表返回类型 的方法的引用。

委托 可认为是函数式语言里的“函数类型”,通过委托,可以将方法视为可赋值给变量或作为参数传递的实体。

委托还类似于其它一些语言中存在的“函数指针”概念。

具有相同参数列表和返回类型的两个不同名称的委托类型被视为不同的委托类型。

delegate 返回类型 委托名<类型参数>(类型 形参); 

2.目标方法

委托可以引用静态方法、实例方法、Lambda 表达式、匿名方法、异步方法等目标方法。

目标方法应与委托声明具有相同的方法签名,注意:此时的返回类型是方法签名的一部分。

3.委托实例化

注意:只需提供目标方法名称,无需添加 () 括号。

//只声明委托变量,未关联目标方法
委托名 变量;

//new运算符创建法
委托名 变量 = new 委托名(目标方法);

//直接赋值法
委托名 变量 = 目标方法;
//lambda表达式(声明和实例化)
委托名 变量 = (参数) => { ... };

//匿名方法(声明和实例化)
委托名 变量 = delegate(类型 形参) { ... };
public delegate void Del(string message);

public static void DelMethod(string str)
{
    Console.WriteLine("DelMethod argument: {0}", str);
}

//new创建法
Del exampleDel1 = new Del(DelMethod);

//直接赋值法
Del exampleDel2 = DelMethod;

4.调用委托实例

将变量视为方法名称,并使用普通方法调用语法调用它。

//直接调用,如果委托是null会生成异常
变量();
//调用之前可以检查是否为null
变量?.Invoke();
exampleDel1("Hey");

exampleDel2("Hey");

5.多播(Multicast)委托

多播(Multicast)委托派生自 System.MulticastDelegate 类,该类属于 System.Delegate 的子类。

调用时,一个委托类型实例可以调用多个方法,这被称为多播。

若要向委托实例的方法列表(调用列表)添加其它方法,请使用加法运算符或加法赋值运算符(“+”或“+=”)。

若要删除委托实例的方法列表(调用列表)中的方法,请使用减法运算符或减法赋值运算符(“-”或“-=”)。

var obj = new MethodClass();
Del d1 = obj.Method1;
Del d2 = obj.Method2;
Del d3 = DelegateMethod;

//包含Method1、Method2和DelegateMethod
Del allMethodsDelegate = d1 + d2;
allMethodsDelegate += d3;

如果调用 allMethodsDelegate 时,使用值类型参数,则将按顺序调用所有这三个方法。

如果调用 allMethodsDelegate 时,使用引用类型参数,则将按相反的顺序调用所有这三个方法,并且一种方法进行的任何更改都将在另一种方法上见到。

如果委托实例具有返回值和/或输出参数,它将返回上次调用方法的返回值和参数。

当方法引发未在方法内捕获到的异常时,该异常将传递到委托的调用方,并且不会调用调用列表中的后续方法。

原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/csharp/csharplang/8286.html

(0)
上一篇 2021年3月9日 20:06
下一篇 2021年3月11日 00:50

相关推荐

发表评论

登录后才能评论