首先要理解委托是什么?(这里单独讨论委托本身,并不牵扯事件。当然可以把事件当做一种特殊类型的委托,以后会详细总结)
1,:从数据结构上来讲,委托是用户自定义的一种数据类型,只不过这种数据类型代表一类方法;
2:从设计模式上来讲,委托(类) 是对方法(对象)的抽象;
委托想实现的功能就是将方法作为另一个方法的参数进行传递;
委托既然是一个类,一种数据类型,那么它存储的是什么类型的数据(我们就可以像对待普通的数据类型那样对待它)?
委托的返回值和参数类型要和你将要传入的方法的返回值和参数类型一致;
看一个例子:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication2delegateOnly
{
//定义委托
public delegate void FunPeople(string name);
class Program
{
static void Main(string[] args)
{
//委托变量初始化(实例化委托)
FunPeople fun = new FunPeople(Program.Fun);
//调用委托
fun("小李哥");
Console.ReadKey();
}
/// <summary>
/// 想要传递的方法,与声明的委托具有相同的返回值类型和参数类型
/// </summary>
/// <param name="name"></param>
static void Fun(string name)
{
Console.WriteLine("{0}很开心!", name);
}
}
}
在这个例子中主要实现以下功能:
声明委托类型
其中
FunPeople fun = new FunPeople(Program.Fun);
完成以下三步:
数据声明(委托类型变量声明)
数据初始化(委托类型变量初始化)
数据赋值 (委托类型变量赋值)
数据运算(委托变量的增加或者减少(一个委托绑定多种方法));
委托调用:委托调用时所有绑定的方法都要被调用。
输出结果:
我们知道,委托是方法的抽象,它存储的就是一系列具有相同签名和返回回类型的方法的地址。调用委托的时候,委托包含的所有方法将被执行。
委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。
委托可以看做是表示一类方法的类,可以将方法当做另一个方法的参数进行传递,这种将方法动态的赋值给参数的方式,避免了大量使用if-else语句。
在使用委托的时候,你可以像对待一个类一样对待它。即先声明,再实例化。只是有点不同,类在实例化之后叫对象或实例,但委托在实例化后仍叫委托。
参照https://www.cnblogs.com/liuhaorain/p/3911845.html