前言
最近有用到委托,所以重新复习了一下委托的相关知识,在此记录一下。
一、什么是委托?
委托是C#中的一种引用类型,委托的本质是一个类,定义了方法的类型,是将方法作为参数传递到另一个方法的特殊类。
委托可以认为是持有一个或者多个方法的对象,当委托被调用时,它持有的方法也会被调用。
委托是方法的抽象,它存储的就是一系列具有相同签名和返回回类型的方法的地址。
委托不是对象,是一种类型。
二、委托的应用
委托的使用遵循三步走的原则,即定义声明委托,实例化委托,调用委托。
1.使用委托的具体步骤
- 定义声明委托
- 实例化委托(给委托赋值)
- 调用委托
一般情况往委托中添加方法,其实是往委托的方法列表中添加,它是一个包含有序方法列表的对象,这些方法具有相同的签名和返回类型。
- 方法的列表称为调用列表
- 委托保存的方法可以来自任何类或结构。(方法的满足条件:委托的返回类型、委托的签名)
- 调用列表中的方法可以是实例方法也可以是静态方法。
- 在调用委托的时候,会执行其调用列表中的所有方法。
2.委托的类型(命名方法委托,多播委托,匿名委托)
委托可以分为 命名方法委托、多播委托、匿名委托,其中命名方法委托是最常见的一种委托。① 命名方法委托:
定义语法格式:
修饰符 delegate 返回值类型 委托名 ( 参数列表 );
实例化委托,命名方法委托在实例化委托时必须带入方法的具体名称,语法如下
委托名 委托对象名 = new 委托名 ( 方法名 );
委托中传递的方法名既可以是静态方法的名称,也可以是实例方法的名称。
需要注意的是,在委托中所写的方法名必须与委托定义时的返回值类型和参数列表相同。
在实例化委托后即可调用委托,语法形式如下:
委托对象名 ( 参数列表 );
实例1:在委托中注入静态方法
实例2:在委托中注入实例方法
② 多播委托:
多播委托是指在一个委托中注册多个方法,在注册方法时可以在委托中使用加号运算符或者减号运算符来实现添加或撤销方法。 实例:模拟点餐平台预定不同类型的商品class Program
{
//定义购买商品委托
public delegate void OrderDelegate();
static void Main(string[] args)
{
//实例化委托
OrderDelegate buy = new OrderDelegate(Order.BuyFood);
//向委托中注册方法
buy += Order.BuyCake;
buy += Order.BuyFlower;
//调用委托
buy();
Console.ReadLine();
}
}
public class Order
{
//委托方法(返回值和参数必须与定义的委托类型一样)
public static void BuyFood()
{
Console.WriteLine("购买快餐!");
}
public static void BuyCake()
{
Console.WriteLine("购买蛋糕!");
}
public static void BuyFlower()
{
Console.WriteLine("购买鲜花!");
}
}
结果:
在委托注册方法时使用 -= 操作符可以撤销委托
在使用多播委托时需要注意,在委托中注册的方法参数列表必须与委托定义的参数列表相同,否则不能将方法添加到委托上。
③ 匿名委托:
匿名委托是指在使用匿名方法注册在委托上,实际上是在委托中通过定义代码块来实现委托的作用。语法格式如下://1. 定义委托
修饰符 delegate 返回值类型 委托名 ( 参数列表 );
//2. 定义匿名委托
委托名 委托对象 = delegate
{
//代码块
};
//3. 调用匿名委托
委托对象名 ( 参数列表 );
实例:使用匿名委托计算长方形的面积
class Program
{
//定义委托
public delegate void AreaDelegate(double length,double width);
static void Main(string[] args)
{
Console.WriteLine("请输入长方形的长:");
double length = double.Parse(Console.ReadLine());
Console.WriteLine("请输入长方形的宽:");
double width = double.Parse(Console.ReadLine());
AreaDelegate area = delegate
{
Console.WriteLine("长方形的面积为:" + length * width);
};
area(length, width);
Console.ReadLine();
}
}
结果:
由于匿名委托并不能很好地实现代码的重用,匿名委托通常适用于实现一些仅需要使用一次委托中代码的情况,并且代码比较少。
总结
以上就是我对C#中有关于委托的相关知识整理,希望对大家有所进步,如有不对的地方,也请不要怪罪哦
参考:https://blog.csdn.net/luan0125/article/details/122957212