在 非托管C/C++中,非成员函数的地址只是一个内存地址。这个地址不带有其他的信息,比如函数期望收到的参数个数、参数类型、函数的返回值以及函数的调用契约。简单的说,非托管C/C++回调函数不是类型安全的。
因此,在.NET Framework中提供了一种称为委托的类型安全的机制。以下代码为委托的几种用法:
1 using System; 2 3 namespace SimpleDelegate 4 { 5 internal delegate void SayDelegate(string str); 6 7 class Program 8 { 9 static void Main(string[] args) 10 { 11 //代理对象的方法 12 SayDelegate sayDelegate = new SayDelegate(new Hello().SaySomething); 13 sayDelegate("Hello Delegate"); 14 //代理静态方法 15 SayDelegate sayStaticDelegate = new SayDelegate(Hello.SaySomethingStatic); 16 sayStaticDelegate("Hello Static Method Delegate"); 17 18 Hello hello = new Hello(); 19 hello.Say(new SayDelegate(new Hello().SaySomething), "Test"); 20 21 Console.Read(); 22 } 23 } 24 25 class Hello 26 { 27 public Hello() 28 { 29 30 } 31 32 /// <summary> 33 /// 说话的方法 34 /// </summary> 35 /// <param name="str">输出的字符串</param> 36 public void SaySomething(string str) 37 { 38 Console.WriteLine(str); 39 } 40 41 /// <summary> 42 /// 静态说话方法 43 /// </summary> 44 /// <param name="str">输出的字符串</param> 45 public static void SaySomethingStatic(string str) 46 { 47 Console.WriteLine(str); 48 } 49 50 /// <summary> 51 /// 说方法(以委托类为参数) 52 /// </summary> 53 /// <param name="sayDelegate">委托类</param> 54 /// <param name="str">输出的字符串</param> 55 public void Say(SayDelegate sayDelegate, string str) 56 { 57 if (sayDelegate != null) 58 { 59 sayDelegate(str); 60 } 61 } 62 } 63 }
个人总结:可以看出委托可以将方法变成一个变量进行使用。这有些类似C/C++中的函数指针,不过这是一个类型安全的函数指针,在Say中可以看到,我们以委托类SayDelegate为参数,若参数不对,则会提示编译错误。