一、委托概述
我们知道,方法的参数中可以有各种类型的变量,但是方法本身也可以作为参数传递到其他方法中,这就是委托的一大特点。
委托是存有对某个方法的引用的一种引用类型变量,引用可在运行时被改变。
所有的委托都派生自System.Delegate类。
二、使用委托
1.声明委托
声明了委托才能把委托当作一个变量来操作
public delegate string SampleDelegate(int n);
2.实例化委托
委托类型通过new关键字来实例化,实例化时可以绑定一个方法作为它的一个引用,只写方法名,不用带参数。
SampleDelegate myDelegate = new SampleDelegate(Method);
也可以实例化后再赋值(或者称为绑定)
SampleDelegate myDelegate = new SampleDelegate();
myDelegate = Method;
实例代码:
internal class Program
{
// 定义一个委托类型
public delegate void SampleDelegate (int n);
private static void Main(string[] args)
{
//读取键盘输入的数字
int num = Convert.ToInt32(Console.ReadLine());
// 创建委托实例,在创建时就关联上需要被引用的方法MyMethod
SampleDelegate myDelegate = new SampleDelegate(MyMethod);
//调用另一个方法,并把委托对象作为参数传递进去
Add(myDelegate,num);
}
private static void Add(SampleDelegate sample,int n){
sample(n);
}
private static void MyMethod(int n)
{
n += n;
Console.WriteLine(string.Format("数字是{0}",n));
Console.ReadKey();
}
}
输入12,效果如下:
三、为什么使用委托
可能你会有疑问,“为什么要通过参数来传递方法?如果要使用其他方法,直接在方法体内调用它不就好了?我从没用过委托,该实现的照样能实现,也没什么问题啊”。
对于这种问题,我的看法从来都是以实用为主,同时遵循规范,并不认为这种做法是完全错误的。但C#作为一门面向对象语言,其三大特点就是封装、继承、多态,做C#开发,就应该尽量编写满足这三大特性的代码,而使用委托就至少体现了其中两种特性:
1.封装:委托可以看成是对方法实现的一层抽象和封装,我们可以把具体的方法实现封装在一个委托类型中,而不暴露方法本身。
2.多态:委托提供了统一的方法签名抽象,我们可以用同一种方式调用不同的方法实现,只要它们的签名与委托类型匹配即可。