2009-11-17 87 views
2

的。如果我宣布一个委托编译器处理一个委托

public delegate void firstDelegate(string str); 

firstDelegate handler = Strfunc; 

handler("Hello World"); 

    .. 
    static void Strfunc(string str) 
    { 
     Console.WriteLine(str); 
    } 

将编译器下面一行

firstDelegate handler=Strfunc; 

转化为

firstDelegate=new firstDelegate(Strfunc); 
+0

注意,在C#2的溶液中加入此功能;您仍然会看到很多使用详细表单的代码,并且很多自动代码生成器仍然会生成它。 – 2009-11-17 01:47:43

+0

感谢Eric Lippert,顺便说一句,通过C#的CLR将是知道所有这些的合适人选吗? – user160677 2009-11-17 02:33:03

回答

2

没错。下面是从反射器的拆卸:

.method private hidebysig static void Main(string[] args) cil managed 
{ 
    .entrypoint 
    .maxstack 3 
    .locals init (
     [0] class ConsoleApplication4.Program/firstDelegate handler) 
    L_0000: nop 
    L_0001: ldnull 
    L_0002: ldftn void ConsoleApplication4.Program::Strfunc(string) 
    L_0008: newobj instance void ConsoleApplication4.Program/firstDelegate::.ctor(object, native int) 
    L_000d: stloc.0 
    L_000e: ldloc.0 
    L_000f: ldstr "Hello World" 
    L_0014: callvirt instance void ConsoleApplication4.Program/firstDelegate::Invoke(string) 
    L_0019: nop 
    L_001a: ret 
} 

它看起来像这样在C#:

private static void Main(string[] args) 
{ 
    firstDelegate handler = new firstDelegate(Program.Strfunc); 
    handler("Hello World"); 
} 
1

到目前为止,我所知道的,YES。

这称为“委托推理”。

顺便说一句,如果你想给另一个函数 “追加” 这一委托,使用方法:

处理器+ = AnotherFunctionName;

这里是从C#优点书中专业C#-2008,第7章的话:

对于少打字,在每一个地方需要一个委托实例的地方,你可以通过名字了 地址。这被称为代表推断。只要编译器可以将代理实例解析为特定类型,此C#功能就可以工作。 由C#编译器创建的代码是相同的。编译器检测到委托类型为 ,因此它会创建该委托类型的一个实例,然后将该方法的地址传递给构造函数。

+0

因此,对于所有功能,我只会传递一条消息。我的意思是,我可以传递不同的消息,一条用于func1,另一条用于func2? – user160677 2009-11-17 01:35:17

+0

我恐怕不是。multicase委托,你可以把它想象成一堆按照这个顺序执行的函数,每一个函数都以相同的函数调用传递。所以他们都处理相同的论点。 这是一个在处理GUI时非常有用的技巧,因为spicific事件可能会触发多个侦听器(处理程序对象)作出反应。 – 2009-11-17 01:38:35