构成委托的要素
1、委托原形声明。例如:public delegate void FreeBack(string s);
2、委托链变量。 FreeBack freeBackChains=null;
3、与委托原形中指定的回调方法具有相容签名的静态或实例方法。
相容签名是指,方法的返回值和委托的返回类型相同或是是其派生类型(称为协变),
或者方法的参数与委托的参数类型相同或者是其基类(称为反协变)
public static void WriteToConsle(string s){
}
public class class1{
public class1(){
}
public void WriteToFile(string s){
}
}
4、将方法添加到(或从中删除)委托链的方法。
FreeBack f1=new FreeBack(writeToConsle);
class1 c1=new class1();
FreeBack f2=new FreeBack(c1.WriteToFile);
//添加委托方法到委托链的两种方法
freeBackChains+=f1;
freeBackChains=(FreeBack) Delegate.Combine(freeBackChains,f2);
//从委托链删除委托方法的中方法
freeBackChians-=f1;
freeBackChians=(FreeBack) Delegate.Remove(f2);
4、调用委托链的方法,执行委托链中的每一个方法。
可以用三种方法调用委托链中的方法:
a)委托链变量(参数);顺序执行委托链中的方法;
b)委托链变量.Invoke(参数);和a)没有本质区别,顺序执行委托链中的方法;
c)委托链变量.GetInvocationList();返回Delegate[]类型,可自行处理委托链中的方法
void Do(string s,FreeBack chain){
chian(s);
}
示例代码:
using System;
using System.Collections;
using System.IO;
public class MyClass
{
//委托声明
internal delegate void FreeBack(string s);
public static void WriteToConsle(string s){
WL("WriteToConsle "+s);
}
public static void Main()
{
string s="Hellow Delegate";
FreeBack freeBackChains=null;
FreeBack f1=new FreeBack(WriteToConsle);
class1 c1=new class1();
FreeBack f2=new FreeBack(c1.WriteToFile);
//添加委托方法到委托链的两种方法
freeBackChains+=f1;
freeBackChains=(FreeBack) Delegate.Combine(freeBackChains,f2);
freeBackChains(s);
WL("----Remove one");
freeBackChains-=f1;
freeBackChains(s);
RL();
}
#region Helper methods
public static void WL(object text, params object[] args)
{
Console.WriteLine(text.ToString(), args);
}
private static void RL()
{
Console.ReadLine();
}
private static void Break()
{
System.Diagnostics.Debugger.Break();
}
#endregion
}
public class class1{
public class1(){
}
public void WriteToFile(string s){
MyClass.WL("WriteToFile "+s);
}
}