Как методы расширения реализованы внутри - PullRequest
6 голосов
/ 01 июля 2011

Как методы расширения реализованы внутри? Я имею в виду, что происходит, когда компилятор видит объявление для метода расширения, и что происходит во время выполнения, когда есть вызов метода расширения.

Включено ли отражение? Или, если у вас есть метод расширения, его код внедряется в метаданные типа целевого класса с некоторыми дополнительными флагами, отмечающими, что это метод расширения, и затем CLR знает, как с этим справиться?

Так в общем, что происходит под капотом?

Ответы [ 7 ]

7 голосов
/ 01 июля 2011

Как уже говорили другие коллеги, это просто статический метод.Все дело в компиляторе, мы можем сказать, что CLR даже не имеет представления о методах расширения.Вы можете попробовать проверить код IL ..

Вот пример

static class ExtendedString
{
    public static String TestMethod(this String str, String someParam)
    {
        return someParam;
    }
}

static void Main(string[] args)
{
    String str = String.Empty;
    Console.WriteLine(str.TestMethod("Hello World!!"));
    ........
}

А вот код IL.

  IL_0001:  ldsfld     string [mscorlib]System.String::Empty
  IL_0006:  stloc.0
  IL_0007:  ldloc.0
  IL_0008:  ldstr      "Hello World!!"
  IL_000d:  call       string StringPooling.ExtendedString::TestMethod(string,
                                                                       string)
  IL_0012:  call       void [mscorlib]System.Console::WriteLine(string)
  IL_0017:  nop

Как вы можете видеть этопросто вызов статического метода.Метод не добавляется в класс, но компилятор заставляет его выглядеть так.И на отражающем слое единственное отличие, которое вы можете видеть, заключается в том, что добавлен CompilerServices.ExtensionAttribute.

4 голосов
/ 01 июля 2011

методы расширения преобразуются в статические функции. Другими словами, они являются синтаксическим сахаром для статических функций.

2 голосов
/ 01 июля 2011

Я не думаю, что reflection участвует в методах расширения.Метод расширения обрабатывается так же, как вы пишете static helper function в helper class, с той лишь разницей, что компилятор сделает это за вас.

1 голос
/ 01 июля 2011

Чтобы уточнить ответ выше ... Методы расширения являются статическими функциями.Дополнительные функции в .NET 3.5 позволяют интерпретировать их как новые методы для рассматриваемого типа.

0 голосов
/ 01 июля 2011

Да, методы расширения - это просто статические методы. У них нет никаких дополнительных привилегий в отношении классов, которые они якобы «расширяют». Однако компилятор помечает статический метод extension как ExtensionAttribute. Вы можете увидеть это в IL. Это заставляет компилятор обращаться с ним особым образом, так что вы не можете вызвать его как обычный статический метод. Например, это не скомпилируется:

var test = new [] { "Goodbye", "Cruel", "World" };
var result = IEnumerable<string>.Where<string>(test, s => s.Length > 5);

Хотя это то, что происходит под капотом.

Но, как замечает LukeH ниже, вы можете вызвать его в классе, где он определен ... Глупый я.

0 голосов
/ 01 июля 2011

Методы расширения очень похожи на static методы, с той лишь разницей, что они имеют атрибут CompilerServices.ExtensionAttribute, который помогает идентифицировать его как метод расширения.

Вы можете прочитать это

0 голосов
/ 01 июля 2011

Методы расширения - это просто статические методы. Единственное отличие заключается в таких инструментах, как редактор Visual Studio, которые открывают их для функции автозаполнения (intellisense). Вы можете найти подробное объяснение здесь: Методы расширения C #: синтаксический сахар или полезный инструмент?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...