C# 和.NET的委托(delegate)与C/C++中的回调函数类似,但是委托比函数指针更安全。因为回调函数只是一个指向存储函数体的内存指针,无法知晓函数的形参和返回类型,也不能保证指针所指的内容一定是所需要的函数体。
当需要将函数作为参数来传递时,才需要函数指针和委托。主要用于启动线程、编写通用类库和事件处理。
C# 中委托的声明格式为:
[[属性]] [委托修饰符] delegate 返回类型 标识符 [<类型参数, …>] (形参列表) [where 类型参数 : 类型参数约束[, …] ……];
其中,委托修饰符有:new、public、protected、internal、private,及它们的有效组合。与常量修饰符的相同。例如:
delegate int D1(int i, double d);
class A {
public static int M1(int a, double b) {…}
}
class B {
delegate int D2(int c, double d);
public static int M1(int f, double g) {…}
public static void M2(int k, double l) {…}
public static int M3(int g) {…}
public static void M4(int g) {…}
delegate object D3(string s);
public static object M5(string s) {…}
public static int[] M6(object o) {…}
}
委托的使用方法参见下例:
delegate void D(int x);
class Test {
public static void M1(int i) {…}
public void M2(int i) {…}
}
class Demo {
static void Main() {
D cd1 = new D(Test.M1); // 静态方法
Test t = new Test();
D cd2 = new D(t.M2); // 实例方法
D cd3 = new D(cd2); // 另一个委托
}
}
新闻热点
疑难解答