using System;
//声明了一个委托,并定义了委托的签名
delegate void SampleDelegate(string message);
public class SampleClass

{
//静态方法
static public void SampleStaticMethod(string message)
{
Console.WriteLine(message);
}
//类的实例方法
public void SampleObjectMethod(string message)
{
Console.WriteLine(message);
}
}
class MainClass

{
static void Main()
{
//可以将静态函数分配给委托,也可以将匿名方法分配给委托,但都必须符合委托的签名
//将静态函数分配给委托
SampleDelegate d1 = new SampleDelegate(SampleClass.SampleStaticMethod);
//将静态函数分配给委托
SampleDelegate d2 = SampleClass.SampleStaticMethod;
//将实例方法分配给委托
SampleClass sampleclass = new SampleClass();
SampleDelegate d3 = new SampleDelegate(sampleclass.SampleObjectMethod);
//将匿名方法分配给委托
SampleDelegate d4 = delegate(string message)
{
Console.WriteLine(message);
};
d1("d1");
d2("d2");
d3("d3");
d3("d4");
Console.ReadLine();
}
}

.method private hidebysig static void Main() cil managed

{
.entrypoint
// Code size 134 (0x86)
.maxstack 3
.locals init ([0] class SampleDelegate d1,
[1] class SampleDelegate d2,
[2] class SampleClass sampleclass,
[3] class SampleDelegate d3,
[4] class SampleDelegate d4)
IL_0000: nop
IL_0001: ldnull
IL_0002: ldftn void SampleClass::SampleStaticMethod(string)
IL_0008: newobj instance void SampleDelegate::.ctor(object,
native int)
IL_000d: stloc.0
IL_000e: ldnull
IL_000f: ldftn void SampleClass::SampleStaticMethod(string)
IL_0015: newobj instance void SampleDelegate::.ctor(object,
native int)
IL_001a: stloc.1
IL_001b: newobj instance void SampleClass::.ctor()
IL_0020: stloc.2
IL_0021: ldloc.2
IL_0022: ldftn instance void SampleClass::SampleObjectMethod(string)
IL_0028: newobj instance void SampleDelegate::.ctor(object,
native int)
IL_002d: stloc.3
IL_002e: ldsfld class SampleDelegate MainClass::"<>9__CachedAnonymousMethodDelegate1"
IL_0033: brtrue.s IL_0048
IL_0035: ldnull
IL_0036: ldftn void MainClass::"<Main>b__0"(string)
IL_003c: newobj instance void SampleDelegate::.ctor(object,
native int)
IL_0041: stsfld class SampleDelegate MainClass::"<>9__CachedAnonymousMethodDelegate1"
IL_0046: br.s IL_0048
IL_0048: ldsfld class SampleDelegate MainClass::"<>9__CachedAnonymousMethodDelegate1"
IL_004d: stloc.s d4
IL_004f: ldloc.0
IL_0050: ldstr "d1"
IL_0055: callvirt instance void SampleDelegate::Invoke(string)
IL_005a: nop
IL_005b: ldloc.1
IL_005c: ldstr "d2"
IL_0061: callvirt instance void SampleDelegate::Invoke(string)
IL_0066: nop
IL_0067: ldloc.3
IL_0068: ldstr "d3"
IL_006d: callvirt instance void SampleDelegate::Invoke(string)
IL_0072: nop
IL_0073: ldloc.3
IL_0074: ldstr "d4"
IL_0079: callvirt instance void SampleDelegate::Invoke(string)
IL_007e: nop
IL_007f: call string [mscorlib]System.Console::ReadLine()
IL_0084: pop
IL_0085: ret
} // end of method MainClass::Main
可见:
1)SampleDelegate d1 = new SampleDelegate(SampleClass.SampleStaticMethod)和SampleDelegate d2 = SampleClass.SampleStaticMethod经编译器便宜后生成完全相同的中间代码。
2)d1("d1"), d2("d2")等这些方法都会调用Invoke(string)方法。
四)委托的判等
先看下面两个语句:
Console.WriteLine(d1.Equals(d2)); //显示"True"
Console.WriteLine(d1.Equals(d3)); //显示"False"
输出是什么呢?
假如回答都是False的话,那就大错了。
委托的判等有点特殊,如果两个委托他们指向的回调目标和回调方法相同,那么结果就是"True".否则"False".
d1和d2显然都是类SampleClass的静态方法SampleStaticMethod。所以d1等于d2是毫无疑问的。
五)委托链
using System;
delegate void D(int x);
class C

{
public static void M1(int i)
{
Console.WriteLine("C.M1: " + i);
}
public static void M2(int i)
{
Console.WriteLine("C.M2: " + i);
}
public void M3(int i)
{
Console.WriteLine("C.M3: " + i);
}
}
class Test

{
static void Main()
{
D cd1 = new D(C.M1);
cd1(-1); // call M1
Console.WriteLine();
D cd2 = new D(C.M2);
cd2(-2); // call M2
Console.WriteLine();
D cd3 = cd1 + cd2;
cd3(1); // call M1 then M2
Console.WriteLine();
cd3 += cd1;
cd3(2); // call M1, M2, then M1
Console.WriteLine();
cd3 -= cd2;
cd3(3);
Console.ReadLine();
}
}