Кто-нибудь знает, как именно IL/CLR генерирует локальные функции C#7

#c# #.net #clr #c#-7.0 #local-functions

Вопрос:

https://www.infoworld.com/article/3182416/c-7-in-depth-exploring-local-functions.html

Мне действительно нужно точно знать, следуя коду, какими должны быть локальные функции.

У меня 0% опыта работы с кодом IL/MSIL.

   public static void Display(string str)
    {
        int ctr = 5;
        DisplayText();

        void DisplayText ()
        {
            for(int i = 0; i < ctr; i  )
            Console.WriteLine(str);
        }
    }
 

Вопрос, который мне нужно знать здесь из предыдущего кода:

  1. Если мы вызываем основную функцию Display() , всегда ли локальная функция DisplayText() генерируется при вызове основной? Или он создан как поддельная локальная функция в C#, но в MSIL он сгенерирован как глобальная функция?
  2. В методе выражения lamda? делает ли это то же самое выше?
  3. Безопасно ли зависеть от локальных функций? или мы все равно не будем его использовать. (производительность, возможно, idk)

Редактировать:- Я думаю, что локальные свойства (которых еще не существует или, может быть …). иногда это также полезно. который вы можете рассчитать тем же методом, что и локальное свойство. как и в предыдущем примере, но DisplayText являются собственностью. Хотелось бы, чтобы они тоже добавили это.

Ответ №1:

CIL и среда выполнения не имеют понятия о локальной функции, вместо этого компилятор C# преобразует ее в обычный метод с частной видимостью и потенциально классом/структурой, используемым для совместного использования состояния с методом объявления. Вы можете убедиться в этом сами, скомпилировав код, а затем декомпилировав сборку, или используя такой сайт, как SharpLab.io.

Лямбда-выражения и анонимные методы очень похожи, за исключением того, что им необходимо предоставить делегат, который может ограничить возможности оптимизации.

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

Комментарии:

1. Я также подумал, почему бы им также не предоставить местную недвижимость? полезно иметь локальные свойства, которые вычисляются или могут возвращать определенные вычисления…

2. Я не думаю, что локальное свойство принесет большую пользу, помимо того, что может быть достигнуто с помощью локального метода, и, конечно, этого недостаточно, чтобы оправдать затраты на его реализацию по сравнению с другими языковыми функциями.