C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针。委托(Delegate) 是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。
委托(Delegate)特别用于实现事件和回调方法。所有的委托(Delegate)都派生自System.Delegate类。
委托是函数(方法)的容器,可以理解为表示函数(方法)的变量类型,委托用来存储、传递函数(方法)。委托的本质是一个类,用来定义函数(方法)的类型(返回值和参数的类型)。不同的函数(方法)必须对应和各自格式一致的委托。
委托的关键字为:delegate。委托是类型,就好像类是类型一样。与类一样,委托类型必须在被用来创建变量以及类型对象之前声明。
delegate void MyDel(int x);
委托类型声明的要求:
(1)以deleagate关键字开头。
(2)返回类型+委托类型名+参数列表。
语法:访问修饰符 delegate 返回值 委托名(参数列表);
我们可以申明在namespace和class语句块中,但更多的写在namespace中。
简单记忆委托语法就是函数申明语法前面加一个delegate关键字。
定义自定义委托
访问修饰默认不写,为public在别的命名空间中也能使用,private其他命名空间就不能用了,大部分时候我们会选择使用public。
委托声明决定了可由该委托引用的方法。委托可指向一个与其具有相同标签的方法。
例如,假设有一个委托:
public delegate int MyDelegate (string s);
上面的委托可被用于引用任何一个带有一个单一的 string 参数的方法,并返回一个 int 类型变量。
声明委托的语法如下:
delegate <return type> <delegate-name> <parameter list>;
我们可以申明一个可以用来存储无参无返回值函数的容器,它只是定义了规则,并没有使用
Delegate void MyFun(); 复制代码
委托规则的申明在同一语句块中不允许重名,表示用来装载或传递返回值int,有一个int参数的函数的委托的容器规则。
Delegate void MyFun2(int a); 复制代码
实例化委托
一旦声明了委托类型,委托对象必须使用 new 关键字来创建,且与一个特定的方法有关。当创建委托时,传递到 new 语句的参数就像方法调用一样书写,但是不带有参数。例如:
public delegate void printString(string s); ... printString ps1 = new printString(WriteToScreen); printString ps2 = new printString(WriteToFile);