(一)什么是委托呢?
在现实生活中的委托的例子。从前孔子让他众徒弟中的三个各自带一样东西出门,并且带回一件猎物回来。他们出去带的东西不同以至于使用的手段不同,带回来的猎物也就不相同这就可以理解为一种师父对徒弟的委托:
这种委托可以表示为: 猎物 方法(行使该方法的工具)
三个徒弟执行委托的方法各不相同:
徒弟1:兔子 打猎(工具 弓)
徒弟2:绵羊 买(工具 钱)
徒弟3:狐狸 诱捕(工具 陷阱)
现实生活中委托是让别人去完成自己要完成的方法。在C#中,也可以不必自己亲自动手,委托给别人来完成某一方法。
(二)为什么要使用委托呢?
c#委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。
(三)C#委托与多态
当我们使用委托的时候,要想调用某个具体方法,不是直接调用这个方法,而是去调用这个委托。通过委托和具体方法之间的某种关联来实现这个方法。所以委托是可以实现方法的多态。我们可以把委托理解为一组方法的抽象。也就是说定义一个方法的模板,至于这个方法具体是怎么样的,是由方法自己本身实现的。委托就相当于一个“接口”。
(四)委托的具体使用
(1)在控制台下使用委托
首先定义一个委托:
public delegate int MathOptDelegate(int value1, int value2);
定义一个事件,包含具体的方法:
然后通过委托调用具体方法:
(2)在窗体中使用委托
上面的例子只是展示了委托,并没有很好的体现出它的有点来。其实,委托和事件在C#中使用非常广泛,例如,当我们点击某个“按钮”的时候,就会有一个“Click”事件触发,而这个事件会通知“委托”,在C#窗体应用程序中,“委托”的名字比较规范,统一使用“EventHandler”,它的具体格式是“void EventHandler(object sender, EventArgs e);”。
如这个小小的例子,当点击按钮的时候标签中显示想要获取的网址。这是怎样实现的呢?你肯定会说这太简单了,我们在设计窗口双击按钮,就会自动为我们生成类似如下的方法:
其实,这里用到的就是事件和委托,这里的button1_Click就是符合EventHandler委托规矩的一个具体的方法,即返回值为void,参数分别是一个object和EventArgs。
我们可以在Form1.Designer.cs中看到如下代码:
可以看到,这里有一个Click事件,然后将一个委托实例附加到这个事件上,跟我们前面讲的控制台应用程序中的用法是完全一样的。那这个Click事件是怎么触发的呢?对于这些系统类的事件,并不用我们管。
当然我们可以定义自己的事件和委托,例如定义一个事件:输出对象的名字。
我们这里定义了一个ShowName委托和一个btnclick事件。并且,在button1_Click()方法中触发这个btnclick事件。最后的结果是,当我们点击按钮的时候,首先弹出一个“我被点击了!!!”的对话框,然后确定之后再弹出另一个显示按钮名称的对话框:
(五)委托的好处:
1.相当于用方法作为另一方法参数(类似于C++的函数指针)
2.在两个不能直接调用的方法中作为桥梁,如:在多线程中的跨线程的方法调用就得用委托。
因为委托理解的有点困难,所以考虑的比较多。