委托与事件学习笔记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

相关文章推荐

c# 委托与事件 学习笔记

/*          *委托与事件          * 当我们需要把方法传递给另一个方法时,我们就需要使用委托          * 一般来...

学习笔记之---C#中的委托与事件

首先抛砖引玉,谈一下本人对委托和事件的理解,然后再引用jimmy.zhang所讲的委托和事件的例子,希望能对还不是很清楚委托和事件的朋友有所帮助。 本人的理解: 委托: 1、  委托是一...

JS和JQuery中的事件委托 学习笔记

事件委托其实并不是一个很高级的技巧,比如在一个页面里面,当只存在两个按钮的时候,可能你给按钮添加监听是这样的:(本文不考虑浏览器兼容性,关于事件的兼容性可参考前面的学习笔记) 按钮1 ...

C#学习笔记8——C# 中的委托和事件

NET委托和事件一、委托1、委托概念OOP中具有相同属性的对象抽象后成为类型(class)。那么,具有相同属性的函数或方法(也称具有相同的函数签名): 返回类型相同 参数类型、参数顺序及参数个数相同抽...
  • byxdaz
  • byxdaz
  • 2011-09-01 00:03
  • 1389

《csharp高级编程》 学习笔记 第七章 委托和事件

第七章 委托和事件 回调(callback)函数是windows编程的一个重要部分。 回调函数实际上是方法调用的指针,也称为函数指针,是一个非常强大的编程特性。 .NET以委托的形式实现了函数指...

《C#高级编程》【第八章】委托、lambda表达式和事件 -- 学习笔记

委托是一个神奇的东西。委托的出现,使得方法可以作为参数进行传递。其中我们接触最多的应该就是通用库类。通用库类,正是由于这种机制才实现了其的通用性。 一、普通委托         委托类由关键字dele...

Android开发艺术探索学习笔记(3)--View的事件体系(1)

View的基础

Lufylegend库学习笔记1 绘图操作及鼠标事件

这几天对于网页前端有点兴趣,学习了一下Canvas的相关知识。 看到Lufylegend库之后,感觉很棒,有一种在写AS的感觉。今天入门第一站,写了一个画板。 是一个非常简易的画板,但是可以看到一些重...

Qt学习笔记(1)---QT5利用事件过滤器实现在控件上绘图

Qt中要在控件中绘制图像,需要重写paintevent函数,本文通过EventFilter(事件过滤器)来实现在控件上的图形绘制。 .h文件 #ifndef WIDGET_H #define WIDG...

AngularJs1学习笔记:AngularJS 输入验证和事件

一:AngularJs1学习笔记:指令 上篇看完angular的指令现在看一下他的指令和验证。这里的验证的对象是input。 事件ng-click 表示点击事件 绑定点击事件 登录 $...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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