| Tony Gong的技术Blog |
|
|||
| 技术旅途中蹒跚的行者 | ||||
|
公告
日历
统计
导航 |
女儿想吃棒冰了,但又不想自己顶着太阳出去买(买棒冰是一个method),所以她叫他倒霉的老爸去买(delegate),最后女儿吃到了棒冰。
这就是一个委托的过程。 接下去,让我们看看一些对委托的解释: 委托是用来处理其他语言(如 C++、Pascal 和 Modula)需用函数指针来处理的情况的。不过与 C++ 函数指针不同,委托是完全面对对象的;另外,C++ 指针仅指向成员函数,而委托同时封装了对象实例和方法。 委托实例的一个有趣且有用的属性是:它不知道也不关心它所封装的方法所属的类;它所关心的仅限于这些方法必须与委托的类型兼容(第 15.1 节)。这使委托非常适合于“匿名”调用。——《C#语言规范》Scott Wiltamuth 和 Anders Hejlsberg 这些解释看起来都是比较艰涩难懂的,让我们用一个例子来充分理解一个简单的委托吧。 首先,建立一个Father类,拥有2个Shared方法(C#为static,即静态方法): OpenTV BuyToys 天下的所有父亲都有帮女儿开电视和买玩具的义务,哈哈 ![]() Public Class FatherClass Father![]() ![]() Public Shared Sub OpenTV()Sub OpenTV(ByVal msg As String) Console.WriteLine("Mission:" & msg) Console.WriteLine("Mission is completed!") End Sub![]() ![]() Public Shared Sub BuyToys()Sub BuyToys(ByVal msg As String) Console.WriteLine("Mission:" & msg) Console.WriteLine("Mission is completed!") End Sub![]() End Class值得注意的是,这2个方法都有一个string的参数,等会儿定义委托的时候也需要相似的参数,这个后面再讲。 Public Delegate Sub DelegatebyFather(ByVal msg As String)
c#代码: public Delegate void DelegatebyFather(String msg);
2,生成一个delegate对象,并将你想要传递的方法作为参数传入(就是把你想让这个委托做的事情传递进取)。 对应上门的说明,我们创建的对象如下: Dim mydelegate As DelegatebyFather
c#代码:mydelegate = New DelegatebyFather(AddressOf Father.BuyToys) DelegatebyFather mydelegate;
mydelegate=new DelegatebyFather(Father.BuyToys); 这2行代码我们可以理解成:女儿和老爸签订了一个委托协议(XX条约?),协议的内容是,老爸去做BuyToys这件事情。 mydelegate.Invoke("buy many toys!")
老爸去买玩具吧!这里我们显式调用了Delegate类的Invoke方法,我们也可以隐式调用: mydelegate("buy many toys!")
隐式调用看上去就像是一个函数,其实,编译器会在IL代码中自动加上Invoke的。 至于c#,只能使用隐式调用,用显式会报错,c#代码如下: mydelegate("buy many toys!")
这样,一个简单的委托过程就结束了,让我们贴一下完整的主程序吧: Module Module1
Sub Main() Dim mydelegate As DelegatebyFather mydelegate = New DelegatebyFather(AddressOf Father.BuyToys) mydelegate.Invoke("buy many toys!") End Sub Public Delegate Sub DelegatebyFather(ByVal msg As String) End Module 执行的结果如下: Mission:buy many toys! Mission is completed! 这一节就先说到这,下一节继续说说委托更近一步的用法。 本文如有不妥,请大家指教。谢谢。 程序员问答社区,解决您的IT难题
|
![]() |
|
| Copyright © Tony.Gong | Powered by: 博客园 模板提供:沪江博客 |