女儿想吃棒冰了,但又不想自己顶着太阳出去买(买棒冰是一个method),所以她叫他倒霉的老爸去买(delegate),最后女儿吃到了棒冰。
这就是一个委托的过程。
接下去,让我们看看一些对委托的解释:
委托是用来处理其他语言(如 C++、Pascal 和 Modula)需用函数指针来处理的情况的。不过与 C++ 函数指针不同,委托是完全面对对象的;另外,C++ 指针仅指向成员函数,而委托同时封装了对象实例和方法。
委托实例的一个有趣且有用的属性是 : 它不知道也不关心它所封装的方法所属的类 ; 它所关心的仅限于这些方法必须与委托的类型兼容 (第 15.1 节) 。这使委托非常适合于“匿名”调用。——《C#语言规范》 Scott Wiltamuth 和 Anders Hejlsberg
这些解释看起来都是比较艰涩难懂的,让我们用一个例子来充分理解一个简单的委托吧。
首先,建立一个Father类,拥有2个Shared方法(C#为static,即静态方法):
OpenTV
BuyToys
天下的所有父亲都有帮女儿开电视和买玩具的义务,哈哈
Public
Class Father
Class Father
![](https://i-blog.csdnimg.cn/blog_migrate/ace65d123aacac170b4b494f8bd4cff1.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/905850cd0fb7d17de7cfa59214ee898a.gif)
Public Shared Sub OpenTV()Sub OpenTV(ByVal msg As String)
Console.WriteLine("Mission:" & msg)
Console.WriteLine("Mission is completed!")
End Sub
![](https://i-blog.csdnimg.cn/blog_migrate/ace65d123aacac170b4b494f8bd4cff1.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/905850cd0fb7d17de7cfa59214ee898a.gif)
Public Shared Sub BuyToys()Sub BuyToys(ByVal msg As String)
Console.WriteLine("Mission:" & msg)
Console.WriteLine("Mission is completed!")
End Sub
![](https://i-blog.csdnimg.cn/blog_migrate/ace65d123aacac170b4b494f8bd4cff1.gif)
End Class
c#代码:
2,生成一个delegate对象,并将你想要传递的方法作为参数传入(就是把你想让这个委托做的事情传递进取)。
对应上门的说明,我们创建的对象如下:
这里我们 显式调用了Delegate类的Invoke方法,我们也可以隐式调用:
隐式调用看上去就像是一个函数,其实,编译器会在IL代码中自动加上Invoke的。
至于c#,只能使用隐式调用,用显式会报错,c#代码如下:
这样,一个简单的委托过程就结束了,让我们贴一下完整的主程序吧:
执行的结果如下:
Mission:buy many toys!
Mission is completed!
这一节就先说到这,下一节继续说说委托更近一步的用法。
本文如有不妥,请大家指教。谢谢。
这就是一个委托的过程。
接下去,让我们看看一些对委托的解释:
委托是用来处理其他语言(如 C++、Pascal 和 Modula)需用函数指针来处理的情况的。不过与 C++ 函数指针不同,委托是完全面对对象的;另外,C++ 指针仅指向成员函数,而委托同时封装了对象实例和方法。
委托实例的一个有趣且有用的属性是 : 它不知道也不关心它所封装的方法所属的类 ; 它所关心的仅限于这些方法必须与委托的类型兼容 (第 15.1 节) 。这使委托非常适合于“匿名”调用。——《C#语言规范》 Scott Wiltamuth 和 Anders Hejlsberg
这些解释看起来都是比较艰涩难懂的,让我们用一个例子来充分理解一个简单的委托吧。
首先,建立一个Father类,拥有2个Shared方法(C#为static,即静态方法):
OpenTV
BuyToys
天下的所有父亲都有帮女儿开电视和买玩具的义务,哈哈
![](https://i-blog.csdnimg.cn/blog_migrate/2560048e5d0bd02d3d9715c6300532d8.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/e3e5ce3036995fd4032ddb74aea89feb.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/ace65d123aacac170b4b494f8bd4cff1.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/905850cd0fb7d17de7cfa59214ee898a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/9c80998dceb86a0f896ca2233785f420.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/ace65d123aacac170b4b494f8bd4cff1.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/ace65d123aacac170b4b494f8bd4cff1.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/291883c6565cc20267256866180009eb.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/ace65d123aacac170b4b494f8bd4cff1.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/905850cd0fb7d17de7cfa59214ee898a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/9c80998dceb86a0f896ca2233785f420.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/ace65d123aacac170b4b494f8bd4cff1.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/ace65d123aacac170b4b494f8bd4cff1.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/291883c6565cc20267256866180009eb.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/ace65d123aacac170b4b494f8bd4cff1.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/cef9d5e7a5bf3b1690352d2606ebd185.gif)
值得注意的是,这2个方法都有一个string的参数,等会儿定义委托的时候也需要相似的参数,这个后面再讲。
然后我们要创建委托。需要注意的是,委托是个类,我们要和对待其他类一样对待他,创建委托需要2道手续:
1,定义一个Delegate类,这个类应当与你想要传递的方法具有相同的参数和返回值类型。
对应上面的说明,我们创建的类如下:
Public
Delegate
Sub
DelegatebyFather(
ByVal
msg
As
String
)
c#代码:
public
Delegate
void
DelegatebyFather(String msg);
2,生成一个delegate对象,并将你想要传递的方法作为参数传入(就是把你想让这个委托做的事情传递进取)。
对应上门的说明,我们创建的对象如下:
Dim
mydelegate
As
DelegatebyFather
mydelegate = New DelegatebyFather( AddressOf Father.BuyToys)
c#代码:
mydelegate = New DelegatebyFather( AddressOf Father.BuyToys)
DelegatebyFather mydelegate;
mydelegate = new DelegatebyFather(Father.BuyToys);
mydelegate = new DelegatebyFather(Father.BuyToys);
这2行代码我们可以理解成:女儿和老爸签订了一个委托协议(XX条约?),协议的内容是,老爸去做BuyToys这件事情。
然后,女儿就可以通过mydelegate这个委托的对象(XX条约),来给老爸发号施令了,代码如下:
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
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!
这一节就先说到这,下一节继续说说委托更近一步的用法。
本文如有不妥,请大家指教。谢谢。