C#delegate:文字构造函数

时间:2015-06-14 15:57:00

标签: c#

假设我在C#中有一些委托:

public delegate void ExampleDelegate();

在某处我有SampleMethod,我希望代表参考:

ExampleDelegate sample = new ExampleDelegate(SampleMethod);

我看到有些人用2行代替的是:

ExampleDelegate sample;
sample = SampleMethod;

在功能方面是否与上述相同或是否存在某些(非预期的)副作用?基本上,我不明白:

之间的区别
ExampleDelegate sample = new ExampleDelegate(SampleMethod);

ExampleDelegate sample; = SampleMethod;

他们似乎也一样......

2 个答案:

答案 0 :(得分:4)

没有区别,它们是一样的。第二个是隐式方法组转换。

此语法是在C#2.0中引入的,并在How to: Declare, Instantiate, and Use a Delegate中的编程指南中进行了介绍。

答案 1 :(得分:2)

他们产生完全相同的cil代码没有区别。

例如。给出以下c#代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication6
{
    public delegate void ExampleDelegate();
    class Program
    {
        static void Main(string[] args)
        {
            ExampleDelegate sample1 = new ExampleDelegate(SampleMethod);
            ExampleDelegate sample2 = SampleMethod;
        }

        static void SampleMethod()
        {

        }
    }
}

这是主要方法的cil代码:

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Code size       28 (0x1c)
  .maxstack  2
  .locals init ([0] class ConsoleApplication6.ExampleDelegate sample1,
           [1] class ConsoleApplication6.ExampleDelegate sample2)
  IL_0000:  nop
  IL_0001:  ldnull
  IL_0002:  ldftn      void ConsoleApplication6.Program::SampleMethod()
  IL_0008:  newobj     instance void ConsoleApplication6.ExampleDelegate::.ctor(object,
                                                                                native int)
  IL_000d:  stloc.0
  IL_000e:  ldnull
  IL_000f:  ldftn      void ConsoleApplication6.Program::SampleMethod()
  IL_0015:  newobj     instance void ConsoleApplication6.ExampleDelegate::.ctor(object,
                                                                                native int)
  IL_001a:  stloc.1
  IL_001b:  ret
} // end of method Program::Main