Intern Day83 - C# - 委托Delegate
为什么引入委托
C#委托最最简单的说法:委托的作用是用来传方法的。
一般的方法/函数只能用来传参数,当需要方法作为参数传递的时候,需要引入 委托
。
委托规则
-
委托和所要传的方法的返回值类型要一致。
-
C#中定义委托用
delegate
关键字。 -
对于一个委托类型,可以创建它的实例,并使这个实例指向一个具体的方法。而这个方法的签名(无论方法具体完成什么功能)必须要与委托类型的定义一致。
-
c#用委托来实现事件通知机制。相当与c++函数指针。
委托的基本实现见下面代码。
委托的多播
委托支持多播。
多播就是同一个委托实例可以指向多个方法,只要调用这个实例,所有方法就会按顺序执行。要向一个委托实例添加方法用 +=
,要移除(多个)方法用 -=
。
委托的多播的基本代码的实现见下面,都写在一起了,便于比较着来看。
定义委托的方法
-
一般定义
-
匿名方法
-
Lambda表达式
具体见下面代码
具体代码
using System;
using System.Diagnostics;
using System.Net.NetworkInformation;
using System.Reflection;
using System.Security.Cryptography;
namespace Practice1 // namespace 索引器
{
public class DelegateTest
{
public int Add(int x, int y) // int Add(int x, int y
{
Console.WriteLine($"{nameof(Add)}:{x}+{y}={x+y}");
// 使用 nameof 操作符来获得名字字符串。(即接收元素值返回元素名)
// ${}:包裹一个变量或表达式
return x + y; // 不写return会报错
}
public int Subtract(int x, int y)
{
Console.WriteLine($"{nameof(Subtract)}:{x}-{y}={x-y}");
return x - y;
}
public int Multiply(int x, int y)
{
Console.WriteLine($"{nameof(Multiply)}:{x}*{y}={x*y}");
return x * y;
}
// Divide
}
// 定义一个委托类型
public delegate int Cal(int x, int y);
class Program
{
static void Main(string[] args)
{
var test = new DelegateTest();
// 定义三个委托实例Cal,指向不同的方法
Cal add = new Cal(test.Add);
Cal sub = new Cal(test.Subtract);
Cal mul = new Cal(test.Multiply);
// ---------------------------------------------------------------------
// 上面add用下面这个代替,就是用 匿名方法 来实现委托实例
/*
Cal add = delegate(int x, int y)
{
Console.WriteLine($"{nameof(Add)}:{x}+{y}={x+y}");
return x + y;
};
*/
// 上面add用下面这个代替,就是用 Lambda表达式 来实现委托实例
/*
Cal add = (int x, int y) =>
{
Console.WriteLine($"{nameof(Add)}:{x}+{y}={x+y}");
return x + y;
};
*/
// ---------------------------------------------------------------------
// 执行委托
int resultAdd = add(5,3);
int resultSubtract = sub(5,3);
int resultMultiply = mul(5,3);
// Console.ReadKey(); // 读取一个字符 不管输多少,只读一个字符结束
// Console.Read(); // 读取一行 输入多少都会读取然后结束
Console.ReadLine(); // 读取一行+回车 输入多少都会读取然后再读取到一个回车才结束
// ---------------------------------------------------------------------
// 委托的多播
Cal cal = new Cal(test.Add);
cal += test.Subtract;
cal += test.Multiply;
// 注意!并不是ans=(ans+x-y)*z连着加减乘,而是每一步都是分开计算的
int ans = cal(5,3);
Console.WriteLine(ans);
}
}
}
输出:
Add:5+3=8
Subtract:5-3=2
Multiply:5*3=15
k
Add:5+3=8
Subtract:5-3=2
Multiply:5*3=15
15 //解释:如果委托类型的定义中具有返回值,那么多播委托执行后的返回值是最后一个方法的返回值,所以ans就是Multiply方法的返回值。
参考
公众号 .NET之窗 的文章:《C#中的委托与事件》(关于项目中如何使用可以看看,目前我没用到)