Что это за тип в .NET (отражение) - PullRequest
34 голосов
/ 19 июня 2011

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

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

enter image description here

Ответы [ 2 ]

49 голосов
/ 19 июня 2011

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

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. Это невыразимое имя в том смысле, что оно недопустимо в C # - это означает, что компилятор C # точно знает, что оно не появится в вашем собственном коде, и противоречит его выбору.

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

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

23 голосов
/ 19 июня 2011

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

Где узнать о "магических именах" отладчика VS

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

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