代表的编译器处理

时间:2009-11-17 01:21:40

标签: c# delegates

如果我宣布代表

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);

2 个答案:

答案 0 :(得分: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 :(得分:1)

到目前为止,我可以说,是的。

这被称为“委托推理”。

顺便说一句,如果你想将另一个函数“追加”到这个代理,请使用:

handler + = AnotherFunctionName;

以下是专业C#-2008第7章中C#专业的话:

为了减少键入,在需要委托实例的每个地方,您只需传递名称即可 地址。这称为委托推理一词。只要编译器可以,这个C#功能就可以工作 将委托实例解析为特定类型。 由C#编译器创建的代码是相同的。编译器检测到委托类型是 必需的,因此它创建该委托类型的实例 将方法的地址传递给构造函数。