委托学习笔记(一):委托的使用

在 非托管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为参数,若参数不对,则会提示编译错误。

posted on 2014-04-15 08:29  PandaPYH  阅读(243)  评论(0编辑  收藏  举报

导航