代码改变世界

浅谈委托和事件之初识C#委托

2011-07-07 16:52  RyanXiang  阅读(972)  评论(4)    收藏  举报

园子里有很多讲委托的文章,都很好。我写这篇文章的目的。一、是为了巩固基础知识。二、让更多的人理解委托、使用委托。说的都比较肤浅,希望大家多批评。

一、委托的概念                                                                            

委托的定义有很多,我始终感觉概念这东西是“仁者见仁智者见智”的东西,大家看哪个好理解就理解哪个好了。常见的委托的定义有如下几种

1、MSDN:委托是一种定义方法签名的类型。 当实例化委托时,您可以将其实例与任何具有兼容签名的方法相关联。 您可以通过委托实例调用方法。

2、委托是一种可以把引用存储为函数的类型。

3、委托是一种类型安全的函数回调机制。

大家不要被概念震住。对于概念的理解都是建立在对其内容充分理解基础上的。看问题的角度不同,总结出来的概念自然也不尽相同,不过殊涂同归,都是在说委托这个语法。下面我们通过Demo来慢慢理解这个C#中令人惊叹的委托机制。

看如下代码:

   1: class Program
   2:    {
   3:        public delegate int CalculateDelegate(int x, int y);
   4:  
   5:  
   6:        static void Main(string[] args)
   7:        {
   8:            CalculateDelegate add = new CalculateDelegate(Program.Add);
   9:            int resultAdd = add(2, 2);
  10:  
  11:            CalculateDelegate minus = new CalculateDelegate(Program.Minus);
  12:            int resultMinus = minus(2, 2);
  13:  
  14:            CalculateDelegate mult = new CalculateDelegate(Program.Mult);
  15:            int resultMult = mult(2, 2);
  16:  
  17:            CalculateDelegate devide = new CalculateDelegate(Program.Devide);
  18:            int resultDevide = devide(2, 2);
  19:  
  20:            Console.WriteLine(resultAdd);
  21:            Console.WriteLine(resultMinus);
  22:            Console.WriteLine(resultMult);
  23:            Console.WriteLine(resultDevide);
  24:            Console.ReadKey();
  25:        }
  26:  
  27:        public static int Add(int x, int y)
  28:        {
  29:            return x + y;
  30:        }
  31:        public static int Minus(int x, int y)
  32:        {
  33:            return x - y;
  34:        }
  35:        public static int Mult(int x, int y)
  36:        {
  37:            return x * y;
  38:        }
  39:        public static int Devide(int x, int y)
  40:        {
  41:            return y == 0 ? 0 : x / y;
  42:        }
  43:    }

二、代码解释:                                                             

程序很简单,首先定义一个用于计算的委托签名,然后在实现四个加、减、乘、除四个方法,最后在Main函数中分别创建委托实例传入方法名,并调用。现在大家是否对如何使用委托有了直观的了解。我总结一下:

1、创建委托签名,该签名除了多一个delegate关键字以外,其它部分和没有函数体的函数完全一样。

2、创建你要引用方法。例子中的Add、Minus、Mult、Devide等方法,方法签名要和委托一样。

3、实例化委托传入要执行的函数后,用委托的实例调用方法。比如

 CalculateDelegate add = new CalculateDelegate(Program.Add);  int resultAdd = add(2, 2);
 
其中Program.Add是实例化委托传入的函数,然后用委托的实例add调用方法Add。有点绕,大家们可以把add理解成一个指针,add(2,2)指向的就是Program.Add(2,2)方法。