对于delegate的通俗理解就是一个指向函数的指针,它的出现使函数可以像变量一样写到函数列表中去,下面跟随一个实例去了解下:
由于只是为了解其用法,所以建一个控制台应用程序完全足够满足要求(先贴代码,然后解释):
控制台类: 新建的类:
namespace Deletegate static void Main(string[] args) MyClass c1 = new MyClass(ShowClassOne); MyClass c2 = new MyClass(ShowClassTwo); Console.ReadKey(); | namespace Deletegate public MyClass(ShowClass shofuc) public ShowClass MyShow { get; set; } public string ClassName { get { return "MyClass"; } } public override string ToString() return MyShow(ClassName); |
从代码中可以看出:
1. 给Delegate变量可以Add多个相同类型的函数,其结果相当于将这些函数依次执行。这就是为什么在对话框应用程序中,经常会对某个事件附加处理函数,例如,
List,SelectedChanged+=EventHander,void EventHander(object sender, System.EventArgs e),EventHander 是自己实现的响应函数,这也就是事件萎托所用的。
2.委托可以作为另外一个函数的参数传递,上面的代码可以看出:
在Program类中实现了两个方法,一个是ShowClassOne,一个是ShowClassTwo,分别用来对传入参数name的两种处理,C1,C2实现的时候分别传入不同的委托,进而实现不同的显示结果。当然,也可以在MyClass类中实现,不过每添加一种显示方式就得改一次MyClass类,这是很不好的,可重用性太差,如此,便可以解决。
在实际编程中。你可能会遇到下面的问题:
做系统的时候,免不了和数据打交道,增,删,改,查最常用,在界面应用程序中,我们可能会以弹出对话框的形式对数据进行添加和修改,这两个对话框如何组织呢,当然是会写一个模板窗口,然后实例话不同而已,这时实现可以有两种方式:
1> 在模板窗口中设置一个变量Sign,根据传入sign的不同实现话不同的窗口中,数据源变化,“保存”的实现等,只需要添加一个Case判断,分别执行不同的语句。
2>在模板窗口中传入Save方法的一个委托,然后模板窗口的代码不需要修改,只需要在调用的时候传入不同的委托就好。
第一种方法可重用性显面易见不如第二种方法,当需要实例化的窗口增多时,不可预计时,第一种方法代价太大。孰优孰劣,只有在自己编程时用到才会知道。
上面程序的运行结果如下图:
一家之言,请各位大牛批评指正~ ~!