扩展方法是语言功能还是CLR的语言功能?

时间:2014-01-20 19:26:36

标签: c# .net clr

C#3为我们带来了扩展方法。

但是,其他语言(如VB.NET)也通过在必须在VB.NET模块中声明的方法上指定属性声明来实现扩展方法。

此外,您可以在C ++ / CLI中使用扩展方法。

所以,我想知道扩展方法是语言功能还是内置于CLR中的功能?

我猜它是一个编译器技巧,因为你甚至可以将它们作为它们在其中声明的类型的普通静态方法调用,因此必须是特定于语言的特性(并且必须由Microsoft在VB.NET中实现,C#和C ++扩展只是为了统一,但对于任何其他想要定位CLR的语言都不是必需的,但我无法确定。

1 个答案:

答案 0 :(得分:4)

他们是语言扩展。如您所料,编译器正在完成所有工作并生成IL代码,该代码将显式调用扩展方法作为静态方法。这可以通过查看IL来验证。

IL_0000:  newobj     instance void Sandbox.Program/Foo::.ctor()
IL_0005:  stloc.0
IL_0006:  ldloc.0
IL_0007:  call       void Sandbox.Program::Bar(class Sandbox.Program/Foo)

我在这里定义了一个类Foo和一个扩展方法Bar(),然后调用了foo.Bar()

Bar()函数的转储显示它没有做任何特殊的事情,除了System.Runtime.CompilerServices.ExtensionAttribute

.method public hidebysig static void Bar(class Sandbox.Program/Foo foo) cil managed
{
  .custom instance void [mscorlib]System.Runtime.CompilerServices.ExtensionAttribute::.ctor() = ( 01 00 00 00 ) 
  // Code size       1 (0x1)
  .maxstack  8
  IL_0000:  ret
} // end of method Program::Bar