1.C/C++中观察者模式的实现可以把回调函数作为指针传递给主体,然后由主体在适当的实际确定什么时候调用观察函数。但是C#没有指针用法,是无法将函数作为参数直接传递的,所以就有了Delegate。委托用来实现C/C++中函数指针的功能,它允许你传递一个类A的方法m给另一个类B的对象,使得类B的对象能够调用这个方法m。
2.delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类。与其它的类不同,delegate类需要先声明要委托函数的类型,并且它"只能持有与它的声明相匹配的方法的引用"。delegate既可以引用静态函数,又可以引用非静态成员函数。静态类参数用 new MyDelegate(classname.method)的形式,实例时参数应该传递instance.method。
3.实现一个delegate是很简单的,通过以下步骤即可实现一个delegate:
1) 定义一个delegate类,相当与Typdef一个新类,类定义不能再函数中,它应当与你想要传递的方法具有相同的参数和返回值类型。
2) 创建delegate对象,并"将你想要传递的函数作为参数传入"。
3) 在要实现异步调用的地方,通过上一步创建的对象来调用方法。
4)C#中的事件处理实际上是一种具有特殊函数参数类型的delegate,象下面这个样子:
public delegate void MyEventHandler(object sender, MyEventArgs e);
2.delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类。与其它的类不同,delegate类需要先声明要委托函数的类型,并且它"只能持有与它的声明相匹配的方法的引用"。delegate既可以引用静态函数,又可以引用非静态成员函数。静态类参数用 new MyDelegate(classname.method)的形式,实例时参数应该传递instance.method。
3.实现一个delegate是很简单的,通过以下步骤即可实现一个delegate:
1) 定义一个delegate类,相当与Typdef一个新类,类定义不能再函数中,它应当与你想要传递的方法具有相同的参数和返回值类型。
2) 创建delegate对象,并"将你想要传递的函数作为参数传入"。
3) 在要实现异步调用的地方,通过上一步创建的对象来调用方法。
4)C#中的事件处理实际上是一种具有特殊函数参数类型的delegate,象下面这个样子:
public delegate void MyEventHandler(object sender, MyEventArgs e);
其中的两个参数,sender代表事件发送者,e是事件参数类。MyEventArgs类用来包含与事件相关的数据,所有的事件参数类都必须从System.EventArgs类派生。当然,如果你的事件不含参数,那么可以直接用System.EventArgs类作为参数。
4.请注意下面代理使用的五种方式,后面两种是匿名函数的使用方法。
代码示例:
using System;
using System.Security.Cryptography;
using System.Text;
namespace ConsoleApp1
{
class Program
{
//1.定义委托类,相当于typedef定义类型名,以后代理的函数必须和它具有相同的返回值和函数参数。
//类似与typedef void (*FUNC)(string);
//注意MyDeletePrototype是一个委托类,只能在类内部定义内部类,不能定义在函数中。
public delegate void MyDelegatePrototype(string ex);
//泛型委托定义方法
//public delegate void MyDelegate<T>(T t);
public static void Main(string[] args)
{
Person p = new Person();
//2.声明定义委托实例变量,类似定义函数指针变量 FUNC pFunc;
//3.给变量赋值,注意这里用new方法创建,(等同于new对象,代理构造函数的参数就是要代理的函数)
//有四种方式:方式1
MyDelegatePrototype delegateInstance = new MyDelegatePrototype(p.printName);
useDelegate(delegateInstance);
//方式2 将函数直接赋值给委托变量
delegateInstance = p.printName;
useDelegate(delegateInstance);
//方式3 在传递参数时,直接传递函数
useDelegate(p.printName);
//方式4 直接传递匿名函数
useDelegate(delegate (string name)
{
Console.WriteLine("Print name:{0}", name);
});
//方式5 匿名函数变形
delegateInstance = delegate (string name)
{
Console.WriteLine("Print name:{0}", name);
};
useDelegate(delegateInstance);
}
//其实委托的就是用来实现将函数作为参数进行传递的,如果没有委托将无法将函数作为参数进行传递。
public static void useDelegate(MyDelegatePrototype d)
{
d("Example");
}
}
class Person
{
public void printName(string name)
{
Console.WriteLine("Print name:{0}", name);
}
}
}
《完》