惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

aimingoo的专栏
aimingoo的专栏
G
Google Developers Blog
B
Blog RSS Feed
A
About on SuperTechFans
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
V
V2EX
Stack Overflow Blog
Stack Overflow Blog
C
Check Point Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Engineering at Meta
Engineering at Meta
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
博客园 - 司徒正美
D
Docker
F
Fortinet All Blogs
Hugging Face - Blog
Hugging Face - Blog
Last Week in AI
Last Week in AI
H
Help Net Security
WordPress大学
WordPress大学
MyScale Blog
MyScale Blog
博客园 - Franky
人人都是产品经理
人人都是产品经理
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Blog — PlanetScale
Blog — PlanetScale
L
LangChain Blog

博客园 - Tony.Gong

新项目中的CC.Net每日编译环境 ActiveReports工作总结12——用Designer控件实现用户自定义报表印刷 ActiveReports工作总结11——麻烦的线线框框 ActiveReports工作总结10——完整的一张成绩一览帐票 ActiveReports工作总结9——打印参数设置 ActiveReports工作总结8——用代码控制布局 ActiveReports工作总结7——常用一览表印刷 今天还有多少人在上班啊? ActiveReports工作总结6——使用子报表 ActiveReports工作总结5——常用分栏帐票印刷 ActiveReports工作总结4——换页打印 ActiveReports工作总结3——换列打印 公司现有产品数据层切换的随想 .net发送邮件的一些技巧 ActiveReports工作总结2——数据源绑定 ActiveReports工作总结1——AR简介 NUnit学习笔记4--单元测试和项目结合的几种方法 成功升级成老爸。。。。 马上要当老爸了。。。。。
委托与事件学习笔记1---什么是委托?
Tony.Gong · 2006-04-30 · via 博客园 - Tony.Gong

女儿想吃棒冰了,但又不想自己顶着太阳出去买(买棒冰是一个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 Module1Sub Main()
        
Dim mydelegate As DelegatebyFather
        mydelegate 
= New DelegatebyFather(AddressOf Father.BuyToys)

        mydelegate.Invoke(

"buy many toys!")
    
End SubPublic Delegate Sub DelegatebyFather(ByVal msg As String)End Module


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

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

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