delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类。 上面的定义解释了一个delegate的声明定义了一个reference type, 而这个reference type是用来将一个方法利用一个指定的形式压缩起来。一个delegate的实例压缩一个静态或者一个实例方法。Delegates和C++中的功能指针很相似。然而,不同的是,delegate是安全的,并且是Type-safe.
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 Type 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是面向对象、类型安全、可靠的受控(managed)对象。 1.声明一个delegate对象,它应当与你想要传递的方法具有相同的参数和返回值类型。
using
System;
public class MyDelegateTest { // 步骤1,声明delegate对象 public delegate void MyDelegate(string name); // 这是我们欲传递的方法,它与MyDelegate具有相同的参数和返回值类型 public static void MyDelegateFunc(string name) { Console.WriteLine("Hello, ", name); } public static void Main() { // 步骤2,创建delegate对象 MyDelegate md = new MyDelegate(MyDelegateTest.MyDelegateFunc); // 步骤3,调用delegate md("sam1111"); } } 输出结果是:Hello, sam1111
C#中的事件处理实际上是一种具有特殊签名的delegate,象下面这个样子: public delegate void MyEventHandler(object sender, MyEventArgs e); 其中的两个参数,sender代表事件发送者,e是事件参数类。MyEventArgs类用来包含与事件相关的数据,所有的事件参数类都必须从System.EventArgs类派生。当然,如果你的事件不含参数,那么可以直接用System.EventArgs类作为参数。 就是这么简单,结合delegate的实现,我们可以将自定义事件的实现归结为以下几步: 1.定义delegate对象类型,它有两个参数,第一个参数是事件发送者对象,第二个参数是事件参数类对象。 下面是一个简单的例子: using System; public class EventTest { // 步骤1,定义delegate对象 public delegate void MyEventHandler(object sender, System.EventArgs e); // 步骤2省略 public class MyEventCls { // 步骤3,定义事件处理方法,它与delegate对象具有相同的参数和返回值类// 型 public void MyEventFunc(object sender, System.EventArgs e) { Console.WriteLine("My event is ok!"); } } // 步骤4,用event关键字定义事件对象 private event MyEventHandler myevent; private MyEventCls myecls; public EventTest() { myecls = new MyEventCls(); // 步骤5,用+=操作符将事件添加到队列中 this.myevent += new MyEventHandler(myecls.MyEventFunc); } // 步骤6,以调用delegate的方式写事件触发函数 protected void OnMyEvent(System.EventArgs e) { if(myevent != null) myevent(this, e); } public void RaiseEvent() { EventArgs e = new EventArgs(); // 步骤7,触发事件 OnMyEvent(e); } public static void Main() { EventTest et = new EventTest(); Console.Write("Please input ''a'':"); string s = Console.ReadLine(); if(s == "a") { et.RaiseEvent(); } else { Console.WriteLine("Error"); } } } |