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

(1)
上一篇 2021年3月9日 20:06
下一篇 2021年3月11日 06:01

相关推荐

  • 3.9C#引用类型之特性(Attribute)

    1.特性声明 所有特性类都直接或间接派生自 System.Attribute 基类。 以下示例声明了 HelpAttribute 特性。 2.调用特性 调用特性时,通过用方括号 ([]) 将特性名称以及实参括起来,并置于应用该特性的实体的声明上方。可以将多个特性附加到实体的声明上。对于给定实体,一些…

    C#语言教程 2021年3月9日
    02800
  • 3.4C#引用类型之类(Class)

    1.类声明 2.继承 派生类只能有一个直接基类。但是,因为一个基类本身可能继承自另一个类,所以一个类可能会间接继承多个基类。省略基类相当于从 object 类型继承。 派生类会隐式获取基类的所有成员(除了基类的静态构造函数、实例构造函数、析构函数),所以无需在派生类再书写继承过来的基类成员,但您还可…

    C#语言教程 2021年3月4日
    08250
  • 1.7C#语言的异常(Exception)语句

    异常类派生自System.Exception类。 throw 使用 throw 关键字,程序可以显式生成异常。 e 是一个派生自 System.Exception类 的异常类的实例。 try-catch try…catch 语句用于捕获在代码块执行…

    C#语言教程 2021年1月7日
    05340

发表回复

登录后才能评论