您的位置:首页 > 编程语言 > C#

C# Delegate的用法之一

2004-12-13 02:56 651 查看
C# Delegate的用法之一

常建昭

前一阵子曾经讨论了关于在一个winform中调用另一个winform的方法,里面提到要做到这一功能,最好的方法是利用Delegate,一些朋友也在回复中提到,Google同学早就发出信息,可怜俺到最后用到才知,不过值的庆幸的是,知识还是学到手了,对于别人可能是个笑话,但对于我自己,是种进步。呵呵,不求与人相比,只求超越自己。。

Ok,闲话少说,现在将我对Delegate的一些理解摆上来让大家PP,如果有错,还请大家更正。

注: 在网上有着许多Delegate的知识和介绍文章,有很多写的非常的详细。我这篇只是我自己对Delegate使用的看法,不保证完全正确。如果误导了你,可别怪我哦。

网上一搜,关于Delegate的中文介绍最热门的估计是Stanley B. Lippman(C# Primer的作者)的翻译版。给个链接,让有需要的朋友可以参考一下。http://www.chinaaspx.com/article/csharp/355.htm (中国DotNet俱乐部提供)

首先来看看Delegate的定义:

A delegate declaration defines a reference type that can be used to encapsulate a method with a specific signature. A delegate instance encapsulates a static or an instance method. Delegates are roughly similar to function pointers in C++; however, delegates are type-safe and secure.

――转自 MSDN的网站

上面的定义解释了一个delegate的声明定义了一个reference type, 而这个reference type是用来将一个方法利用一个指定的形式压缩起来。一个delegate的实例压缩一个静态或者一个实例方法。Delegates和C++中的功能指针很相似。然而,不同的是,delegate是安全的,并且是Type-safe.

我初看这个定义的时候,觉的怪怪的,因为那时完全不明白什么是type-safe,而且小弟没接触过C++,除了知道有个指针,还就什么都不知道了。好在有Google兄弟,下面这二个定义应该能帮助我们更好的了解Delegate.

这二个定义是在codeProject网站中找到的。

C# delegate is a callback function. In other words, delegate is a way to provide feedback from class-server to class-client.

C#的delegate是一种callback功能。换句话说,delegate是一种从类的服务端向类的客户端提供反馈的一种途径。

C# delegate is smarter then “standard” callback because it allows defining a strict list of parameters which are passed from class-server to class-client

但是C# delegate却比一般的callback 功能要更聪明。因为它允许定义一个严格的参数列表。而这个参数列表则包含着从类的服务端向类的客户端把传递的参数。

在Lippman 的文章中,他解释了三点C# delegate与C++指针的不同的地方。个人认为解释的非常好,对于理解delegate有很大帮助。现贴在这里,有助大家“消化”。

C# 的 Delegate Type

Delegate 是一种函数指针,但与普通的函数指针相比,区别主要有三:

1) 一个 delegate object 一次可以搭载多个方法(methods),而不是一次一个。当我们唤起一个搭载了多个方法(methods)的 delegate,所有方法以其“被搭载到 delegate object 的顺序”被依次唤起——稍候我们就来看看如何这样做。

2) 一个 delegate object 所搭载的方法(methods)并不需要属于同一个类别。一个 delegate object 所搭载的所有方法(methods)必须具有相同的原型和形式。然而,这些方法(methods)可以即有 static 也有 non-static,可以由一个或多个不同类别的成员组成。

3) 一个 delegate type 的声明在本质上是创建了一个新的 subtype instance,该 subtype 派生自 .NET library framework 的 abstract base classes Delegate 或 MulticastDelegate,它们提供一组 public methods 用以询访 delegate object 或其搭载的方法(methods)

下面是我结合在一个窗口中调用另一个窗口的实例来说明delegate的定义和用法:

定义delegate:

public void delegate FormHandler(string msg, Buddy buddy)

创建instance:

FormHandler formHandler = new FormHandler(string msg, Buddy buddy);

指定目标:

FormHandler = new FormHandler(FormShow);

显示form的方法:

public void FormShow (string msg, Buddy buddy)

由上面的程序可以大概看的出如何定义和启动一个delegate,我用上面的方法成功的实现了在一个窗口中调用另一个窗口的功能。如果你有任何问题,可以给我发email,大家可以讨论讨论。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: