C# 3给我们带来了扩展方法。
但是,其他语言(如VB.NET )也通过在必须在VB.NET模块中声明的方法之上指定属性声明的方式来实现扩展方法。
此外,还可以在C++/CLI中使用扩展方法。
所以,我想知道扩展方法是一个语言特性还是一个内置在CLR中的特性?
我猜这是一个编译器技巧,因为您甚至可以将它们作为在其内部声明的类型的简单静态方法来调用,因此必须是特定于语言的特性(并且必须是由微软在VB.NET、C#和C++扩展中实现的,只是为了统一起见,但对于任何其他想要针对CLR的语言来说都是不必要的),但我无法确定。
发布于 2014-01-20 19:29:03
它们是语言的延伸。正如您所怀疑的,编译器正在执行所有的工作并生成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::Barhttps://stackoverflow.com/questions/21242469
复制相似问题