Welcome

首页 / 软件开发 / C# / 我眼中委托的真正面貌(二)

我眼中委托的真正面貌(二)2011-06-28 博客园 独孤残云对于上一篇随笔,不少朋友留下了很不错的见解,也有不少朋友提出了很有代表性的问题。所以,在正文开始之前,我想先就这些问题阐述一下自己的观点,也请朋友们给予批评指正:

首先来说,feiyang朋友提出了有关委托与函数指针间的连带关系。我很赞同这样的说法。

其实,对C++有所了解的朋友都会知道:一个类内部所包含的方法,其实在类内部仅仅表现为一个函数指针,其实现部分并未占用类的内存空间。假如我们在一个类内部声明了一个委托实例对象,同时为它挂载了其他类内部的一个方法(当然,这个方法必须是共有型的),这样,在本类内部就同样拥有了这个方法的函数指针(可以理解为它被存储在委托对象的内部)——这就相当于在本类内部声明了一个一模一样的方法。

而事实上,假如我们通过已声明的委托对象来调用相应的方法,C#的编译器将自动将其作为本类的声明方法来对待(从C#编译器的安全角度来论证,这个说法是行得通的)。其实目标委托对象并非真正意义上的类方法,而仅仅只是作为一个目标方法的代理方法而存在,这便是委托(代理)一词的由来。

另外feiyang兄也提到了有关委托与接口回调机制的区别与联系问题,我已经在上一篇随笔中给予了回复,其中谈到了有关接口回调方法所存在的一些限制。在这里,我们不妨尝试一下,使用接口回调是否可以实现C#的事件机制:

5(2)使用接口回调仿真控件的事件机制(尝试)

首先,我们建立一个控件项目,代码如下:

namespace InfceCalbckEvCtrl

{

public partial class UserControl1 : UserControl

{

//声明接口类型

public interface ICallbackEvn

{

void ShowObjTxt(string Txt);

}

//定义(但不实例化)接口对象

public ICallbackEvn ObjCallEvn;

public UserControl1()

{

InitializeComponent();

}

private void button1_Click(object sender, EventArgs e)

{

ObjCallEvn.ShowObjTxt("接口回调仿真事件调用成功!");

}

}

}