这是<<程序员>>上面的文章,2003年合订本上面的.
蔡学镛的 函数指针的进化论 里面的.
摘录下来一部分..
补充说明,MultiCaseDelegate继承自Delegate,M$本意是让Delegate的派生类只能包装一个方法,MultiCaseDelegate的派生类可以包装多个方法.但是后来发现这样的设计多相当多的缺点,所以干脆让所有的Delegate都继承自MultiCaseDelegate.由于这样重大的设计变更得太晚,所以M$不敢全面调整.NET Framework,怕会出现Bug.所以没有动原先的程序库,只有更动编译器和文件...
Delegate的实现代码相当于下面:
delegate void MyDelegate(int p1,double p2);
class MyDelegate : MulticaseDelegate{
public MyDelegate(object target,System.IntPrt ){...} // IntPrt 和 Pointer无关,是Native int的意思.
public void virtual Invoke(int p1,double p2){...}
....
}
但是在实际 的使用中,这样的代码是不能直接编译成功的.因为C#语言规定,只有C#编译器可以直接制造出继承自MulticaseDelegate的派生类别,编程员不可以在C#源码中定义MulticaseDelegate的派生类别.换句话说,这样的语法甜头是强制的,非用不可,别无选择..
构造函数中的第一个参数就是方法所属的对象(object target),第二个参数就是此方法在 Method Metadata table中的位置.呵呵,程序员当然不会知道这个位置是几号(但是编译器知道),所以编程员无法直接使用此构造函数.
蔡学镛的 函数指针的进化论 里面的.
摘录下来一部分..
补充说明,MultiCaseDelegate继承自Delegate,M$本意是让Delegate的派生类只能包装一个方法,MultiCaseDelegate的派生类可以包装多个方法.但是后来发现这样的设计多相当多的缺点,所以干脆让所有的Delegate都继承自MultiCaseDelegate.由于这样重大的设计变更得太晚,所以M$不敢全面调整.NET Framework,怕会出现Bug.所以没有动原先的程序库,只有更动编译器和文件...
Delegate的实现代码相当于下面:
delegate void MyDelegate(int p1,double p2);
class MyDelegate : MulticaseDelegate{
public MyDelegate(object target,System.IntPrt ){...} // IntPrt 和 Pointer无关,是Native int的意思.
public void virtual Invoke(int p1,double p2){...}
....
}
但是在实际 的使用中,这样的代码是不能直接编译成功的.因为C#语言规定,只有C#编译器可以直接制造出继承自MulticaseDelegate的派生类别,编程员不可以在C#源码中定义MulticaseDelegate的派生类别.换句话说,这样的语法甜头是强制的,非用不可,别无选择..
构造函数中的第一个参数就是方法所属的对象(object target),第二个参数就是此方法在 Method Metadata table中的位置.呵呵,程序员当然不会知道这个位置是几号(但是编译器知道),所以编程员无法直接使用此构造函数.