委托与事件学习笔记1---什么是委托?

转载 2006年05月18日 17:07:00
女儿想吃棒冰了,但又不想自己顶着太阳出去买(买棒冰是一个method),所以她叫他倒霉的老爸去买(delegate),最后女儿吃到了棒冰。
这就是一个委托的过程。
接下去,让我们看看一些对委托的解释:

委托是用来处理其他语言(如 C++、Pascal 和 Modula)需用函数指针来处理的情况的。不过与 C++ 函数指针不同,委托是完全面对对象的;另外,C++ 指针仅指向成员函数,而委托同时封装了对象实例和方法。

委托实例的一个有趣且有用的属性是它不知道也不关心它所封装的方法所属的类它所关心的仅限于这些方法必须与委托的类型兼容(第 15.1 节)。这使委托非常适合于“匿名”调用。——《C#语言规范》Scott Wiltamuth Anders Hejlsberg

这些解释看起来都是比较艰涩难懂的,让我们用一个例子来充分理解一个简单的委托吧。

首先,建立一个Father类,拥有2个Shared方法(C#为static,即静态方法):
OpenTV
BuyToys
天下的所有父亲都有帮女儿开电视和买玩具的义务,哈哈
Public Class Father

    
Public Shared Sub OpenTV(ByVal msg As String)
        Console.WriteLine(
"Mission:" & msg)
        Console.WriteLine(
"Mission is completed!")
    
End Sub


    
Public Shared Sub BuyToys(ByVal msg As String)
        Console.WriteLine(
"Mission:" & msg)
        Console.WriteLine(
"Mission is completed!")
    
End Sub


End Class

值得注意的是,这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#代码:
DelegatebyFather mydelegate;
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

执行的结果如下:
Mission:buy many toys!
Mission is completed!

这一节就先说到这,下一节继续说说委托更近一步的用法。

本文如有不妥,请大家指教。谢谢。

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=699115

委托和事件的区别(讲的很详细)

原文地址:http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-in-CSharp.aspx 委托 和 事件在 .Net F...
  • chopper7278
  • chopper7278
  • 2008年10月25日 23:58
  • 12412

委托与事件学习笔记1---什么是委托?

女儿想吃棒冰了,但又不想自己顶着太阳出去买(买棒冰是一个method),所以她叫他倒霉的老爸去买(delegate),最后女儿吃到了棒冰。这就是一个委托的过程。接下去,让我们看看一些对委托的解释:委托...
  • zhangchen1006
  • zhangchen1006
  • 2007年09月02日 16:18
  • 285

事件与委托趣谈

 事件与委托似乎很难以理解,这是因为它们的使用方式与常用的编码有很大的差别,例如通常编写的都是同步代码,调用一个类型的方法,会即刻出现方法执行的结果,这是符合逻辑的。但在某些情况中,同步代码未必满足需...
  • chiangbt
  • chiangbt
  • 2008年01月17日 21:51
  • 26593

观察者设计模式 Vs 事件委托(java)

观察者设计模式 Vs 事件委托标签: 设计模式 java 事件的委托本篇博客主要讲解一下几个问题 什么是观察者模式 观察者模式的优缺点 如何看待观察者模式的缺点 事件的委托 什么是观察...
  • gdutxiaoxu
  • gdutxiaoxu
  • 2016年07月05日 00:03
  • 6178

Unity中对于委托、事件的应用

[引言] 这边文章主要是针对刚踏入这行的程序员,是我工作半年多来积累下来的一些经验,仅作为参考,也希望各位经验丰富的前辈多批评指正。 我是专科生毕业,我们学校所教的C#的内容其实只有非常非常基础的那些...
  • GhostOrange
  • GhostOrange
  • 2016年11月13日 18:01
  • 2394

快速理解C#中的委托与事件

以下内容只是个人理解,仅供参考。 什么是委托? 先看最简单的委托例子: namespace DelegateTest { public delegate void MessageDele...
  • Wiiix
  • Wiiix
  • 2016年05月20日 20:02
  • 5641

CSharp学习笔记之十一 委托与事件

对C#的委托和事件,其实想写点东西,但是偶然间翻到一篇文章,感觉挺好的,所以就直接转过来吧。其实好的东西都是要用来分享的么,不管是不是我自己的,但是学会了,就是我自己的。学习么就是这样的,这篇博文不算...
  • caosiyuan1991
  • caosiyuan1991
  • 2013年12月27日 16:26
  • 4448

C# .Net 委托和事件的区别

   在.net中,事件是一种特殊的委托,那他到底特殊在哪,换句话说,加上event关键字到底有什么用,我理解主要有两方面,下面用实例说明:    一 、事件只能在本类型内部“触发”,委托不管在本类型...
  • azkaser
  • azkaser
  • 2009年11月24日 15:18
  • 8887

C# 中的委托和事件(详解)

C# 中的委托和事件        委托和事件在 .NET Framework 中的应用非常广泛,然而,较好地理解委托和事件对很多接触 C# 时间不长的人来说并不容易。它们就像是一道槛儿,过了这个槛...
  • ZXD9790902
  • ZXD9790902
  • 2016年09月29日 09:10
  • 379

[C#]委托和事件(详细讲解)

引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易。它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没...
  • s10141303
  • s10141303
  • 2014年03月02日 00:23
  • 4322
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:委托与事件学习笔记1---什么是委托?
举报原因:
原因补充:

(最多只允许输入30个字)