Подтвердить что ты не робот

Что это за тип .NET(Reflection)

Что это за тип .NET? Я использую отражение, чтобы получить список всех классов, и это появляется.

Что это? От куда это? Как выбрано имя DisplayClass1? Я искал источники и ничего не видел. Что означает <>? что означает c__? есть ссылка?

enter image description here

4b9b3361

Ответ 1

Это почти наверняка класс, сгенерированный компилятором из-за лямбда-выражения или анонимного метода. Например, рассмотрите этот код:

using System;

class Test
{
    static void Main()
    {
        int x = 10;
        Func<int, int> foo = y => y + x;
        Console.WriteLine(foo(x));
    }
}

Это скомпилировано в:

using System;

class Test
{
    static void Main()
    {
        ExtraClass extra = new ExtraClass();
        extra.x = 10;

        Func<int, int> foo = extra.DelegateMethod;
        Console.WriteLine(foo(x));
    }

    private class ExtraClass
    {
        public int x;

        public int DelegateMethod(int y)
        {
            return y + x;
        }
    }
}

... за исключением использования <>c_displayClass1 в качестве имени вместо ExtraClass. Это невыразимое имя в том, что оно не является допустимым С#, что означает, что компилятор С# точно знает, что он не появится в вашем собственном коде и не столкнется с его выбором.

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

Компилятор также генерирует дополнительные классы для блоков итератора и (в С# 5) асинхронных методах и делегатах.

Ответ 2

Джон, конечно, прав. Я предоставил "кольцо декодера" для выяснения того, что означают имена типов, генерируемые компилятором:

Где узнать о "волшебных именах" отладочного устройства VS

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