代码改变世界

委托

2009-12-02 17:30  宗哥  阅读(299)  评论(0编辑  收藏  举报

委托定义:

  委托是一种数据结构,它引用静态方法或引用类实例及该类的实例方法。

  OOP世界是个很有意思的世界,我们知道类(Class)是具有相同行为和特性的对象(Object)的抽象,对象(Object)是类(Class)的实例,如果你方法作为一个对象,那么抽象这些具有相同行为和特性(方法的签名)的类在哪里那?这就是委托。本质上委托是个类。

   Delegate 类是委托类型的基类。然而,只有系统和编译器可以显式地从 Delegate 类或 MulticastDelegate 类派生。此外,还不允许从委托类型派生新类型。Delegate 类不是委托类型,该类用于派生委托类型。

  定义委托:

public delegate int  Calculate(int par1,int par2);

  Refectlor其IL代码:

1 .class public auto ansi sealed Calculate
2     extends [mscorlib]System.MulticastDelegate
3 {
4     .method public hidebysig specialname rtspecialname instance void .ctor(object 'object', native int 'method') runtime managed
5     {
6     }
7  //……
8 }
9 

 注意其Sealed了吗?

 委托使用:

作为委托参数传递的方法必须与委托声明具有相同的签名.

代码
方法签名:C#指方法参数(类型和修饰符号)和返回类型。
例如: Method Void(
int par1) 和 Method1 Void(int par1)签名一致 
       Method 
int(int par1) 和 Method1 Void(int par1)签名不一致(方法名字和返回类型)
       Method 
int(int par1) 和 Method Void(ref int par1)签名不一致(参数修饰符号)

 简单使用:

 1  //定义委托计算两个数的返回结果
 2     public delegate int  Calculate(int par1,int par2);
 3 
 4     class Program
 5     {
 6         static void Main(string[] args)
 7         {
 8             Calculate c = new Calculate(Add);
 9             int calculateResult = c(12);
10             Console.WriteLine("委托Calculate(Add)计算的结果{0}",calculateResult);
11         }
12 
13         static int Add(int par1, int par2)
14         {
15             return par1 + par2;
16         }
17     }

  个委托被映射到Add方法,可以这么理解方法Add实例化了委托Calculate。委托delegate 的构造函数为:

作为参数传递:

   public delegate int Calculate(int par1, int par2);

   
public class Calculater
    {
       Calculate instanceCalculate;

       
public Calculater(Calculate instanceDelegate)
       {
          
this.instanceCalculate = instanceDelegate;
       }

       
public int Calculate(int par1,int par2)
       {
           
return instanceCalculate(par1, par2);
       }

    }
//调用
   class Program
    {
        
static void Main(string[] args)
        {
            Calculater c 
= new Calculater(Add);
            
int result =  c.Calculate(12);
            Console.WriteLine(
"委托Calculate(Add)计算的结果{0}", result);
        }

        
static int Add(int par1, int par2)
        {
            
return par1 + par2;
        }
    }

 还记得模板设计模式吗?这个看以看做是模板方法的一种实现。

委托Calculate被实例化了Add,有点IOC/LSP?的味道。

 

 

;