假设我在C#中有一些委托:
public delegate void ExampleDelegate();
在某处我有SampleMethod,我希望代表参考:
ExampleDelegate sample = new ExampleDelegate(SampleMethod);
我看到有些人用2行代替的是:
ExampleDelegate sample;
sample = SampleMethod;
在功能方面是否与上述相同或是否存在某些(非预期的)副作用?基本上,我不明白:
之间的区别ExampleDelegate sample = new ExampleDelegate(SampleMethod);
和
ExampleDelegate sample; = SampleMethod;
他们似乎也一样......
答案 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