2014-01-20 2 views
0

C# 3 принес нам методы расширения.Являются ли методы расширения языковой функцией или языком CLR?

Однако другие языки, такие как VB.NET, также реализуют методы расширения путем указания объявления атрибута поверх метода, который должен быть объявлен в модуле VB.NET.

Кроме того, вы можете использовать методы расширения в C++/CLI.

Итак, мне интересно, являются ли методы расширения языковой функцией или функцией, встроенной в среду CLR?

Я предполагаю, что это трюк компилятора, поскольку вы можете даже вызывать их как простые статические методы типов, в которых они объявлены, и поэтому должны быть специфичными для языка (и должны быть реализованы Microsoft в VB.NET, C# и C++ расширения только ради единства, но не нужны для любого другого языка, который хочет настроить таргетинг на CLR), но я не мог быть уверен.

ответ

4

Это языковое расширение. Как вы подозревали, компилятор выполняет всю работу и создает 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 
+1

на любой версии .NET Framework, даже те «перед «были добавлены методы расширения, просто создав соответствующий атрибут в вашем решении. – vcsjones

+0

Спасибо, @dvnrrs. Итак, если я создаю абстрактное дерево синтаксиса (AST), скажем, используя System.CodeDOM, простого статического класса, который имеет один статический метод, но без первого параметра с префиксом ключевого слова this, но вместо этого применяет объявление ExtensionAttribute на статический метод, а затем я скомпилирую AST с помощью компилятора C#, он не будет генерировать метод расширения, правильно? –

+0

@ WaterCoolerv2 Я думаю, что это ... ExtensionAttribute будет единственной разницей на уровне IL между регулярной статической функцией, которая принимает аргумент типа 'T' и метод расширения типа T. Я отправил IL-дамп выше моего метода расширения образца, чтобы вы могли посмотреть. – TypeIA

Смежные вопросы