Что это за тип .NET? Я использую отражение, чтобы получить список всех классов, и это появляется.
Что это? От куда это? Как выбрано имя DisplayClass1? Я искал источники и ничего не видел. Что означает <>
? что означает c__
? есть ссылка?
Что это за тип .NET? Я использую отражение, чтобы получить список всех классов, и это появляется.
Что это? От куда это? Как выбрано имя DisplayClass1? Я искал источники и ничего не видел. Что означает <>
? что означает c__
? есть ссылка?
Это почти наверняка класс, сгенерированный компилятором из-за лямбда-выражения или анонимного метода. Например, рассмотрите этот код:
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) асинхронных методах и делегатах.
Джон, конечно, прав. Я предоставил "кольцо декодера" для выяснения того, что означают имена типов, генерируемые компилятором:
Где узнать о "волшебных именах" отладочного устройства VS
Имена довольно длинные, и иногда мы получаем жалобы на то, что в результате мы увеличиваем размер метаданных. Мы могли бы изменить правила генерации имен для решения этой проблемы в любое время в будущем. Поэтому очень важно, чтобы вы не писали код, который использует знание этой детали реализации компилятора.