首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >扩展方法是语言特性还是CLR的语言特性?

扩展方法是语言特性还是CLR的语言特性?
EN

Stack Overflow用户
提问于 2014-01-20 19:26:35
回答 1查看 305关注 0票数 0

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

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

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

所以,我想知道扩展方法是一个语言特性还是一个内置在CLR中的特性?

我猜这是一个编译器技巧,因为您甚至可以将它们作为在其内部声明的类型的简单静态方法来调用,因此必须是特定于语言的特性(并且必须是由微软在VB.NET、C#和C++扩展中实现的,只是为了统一起见,但对于任何其他想要针对CLR的语言来说都是不必要的),但我无法确定。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-20 19:29:03

它们是语言的延伸。正如您所怀疑的,编译器正在执行所有的工作并生成IL代码,该代码显式地将扩展方法调用为静态方法。这可以通过查看IL来验证。

代码语言:javascript
复制
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

代码语言:javascript
复制
.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
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21242469

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档