C# 中的委托 (初级应用)
前言
前段时间在整理C#知识点的时候,对于委托这个略微高级的概念有一些迷茫,经过查阅书籍,网上视频,现在终于对这个概念有了一定的认知。此篇文章也用于对自己所学知识的梳理。
一、委托的概念
官方的解释:委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。
梳理
- 委托是一个类
- 实际上是一个方法的模板
- 委托是一个方法的引用,不做实际意义的事
- 增加方法的可扩展性
对于第三点,举个例子:我现在在超市买东西,我同事打电话跟我说他鼠标没电了,让我带两节电池给他。
在这个例子中,"我同事"就是委托的对象,“我” 就是去完成这个委托的方法。
二、委托的声明语法
/**
* delegate 是声明委托的关键字
* <return type> 返回值类型
* <delegate-name> 委托名
* <parameter list> 参数列表
*/
delegate <return type> <delegate-name> <parameter list>
三、委托的使用方式
这里我们用一个加减运算示例
以下代码是没有使用委托,单纯使用调用方法进行计算
public static int Add(int a, int b)
{
return a + b;
}
public static int Sub(int a, int b)
{
return a - b;
}
static void Main(string[] args)
{
int a = 10, b = 5;
Console.WriteLine(Add(a, b));
Console.WriteLine(Sub(a, b));
Console.ReadKey();
}
使用委托
namespace 委托
{
class Program
{
//声明一个委托,其返回值类型和参数需要与方法保持一致
public delegate int Calc(int a, int b);
public static int Add(int a, int b)
{
return a + b;
}
public static int Sub(int a, int b)
{
return a - b;
}
static void Main(string[] args)
{
int a = 10, b = 5;
Console.WriteLine(Add(a, b));
Console.WriteLine(Sub(a, b));
//实例化委托
Calc calc = new Calc(Add);
//委托的调用(间接调用)
calc.Invoke(a,b);
//委托的调用(直接调用)
calc(a, b);
//注意,委托的间接调用和直接调用的结果是一致的
Console.ReadKey();
}
}
}
四、委托的作用
上面介绍了委托的简单使用,那么问题来了,这样使用委托有什么意义呢?
直接使用方法名 Add(a, b) 不是更为简单吗
实际上,上面的示例代码只是为了演示委托的用法,没有实际的作用
上面委托的概念梳理中第二条提过,委托是方法的模板
namespace 委托
{
class Program
{
//声明一个委托,其返回值类型和参数需要与方法保持一致
public delegate int Calc(int a, int b);
public static int Add(int a, int b)
{
return a + b;
}
public static int Sub(int a, int b)
{
return a - b;
}
/// <summary>
/// 动态计算
/// 通过外部传入的方法进行不同的计算方法
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
/// <param name="calc"></param>
/// <returns></returns>
public static int ActiveCalc(int a, int b, Calc calc)
{
return calc.Invoke(a, b);
}
static void Main(string[] args)
{
int a = 10, b = 5;
ActiveCalc(a, b, Add);
ActiveCalc(a, b, Sub);
Console.ReadKey();
}
}
}
通过上面的示例代码,我们可以发现在ActiveCalc方法的参数列表中传入了一个Calc委托,让这个方法具有了动态计算的能力
在外面调用时,我们只要根据业务需求,给实参传入不同的方法,即可在同一方法中得到不同的结果,也就是上文所提到的在方法中使用委托参数,可以使该方法增加可扩展性
特别一提的是:委托作为方法的模板,必须将方法的签名(即返回值与参数列表)与委托的签名保持一致!
举个例子:我写了一段代码,今天我的代码突然出BUG了,但是我有更重要的事要去做,所以我委托小王去帮我改一下BUG。
在上面的例子中,我的委托人小王,必须要满足我的要求才能去替我做这件事情,要求就是小王能读懂代码,否则我不能委托他去提我完成这件事情
看懂代码就是参数,能否改好BUG就是返回值。
五、委托高级应用
- 多播
委托对象可使用 “+” 运算符进行合并。一个合并委托调用它所合并的两个委托。只有相同类型的委托可被合并。“-” 运算符可用于从合并的委托中移除组件委托。
Calc calc1 = new Calc(Add);
Calc calc2 = Sub;//也可以这样实例化委托
calc1 += calc2;
calc.Invoke(a, b);
- 与Event(事件)配合使用
在WinForm、WPF中,委托一般会与事件配合使用,如点击事件就是用委托去引用一个方法,去完成控件被点击的之后的操作。
由于篇幅较多,此文不在赘述,有事件的话我会去整理一下文档,另开一篇幅专门讲述委托与事件这一块的内容