Значение <> в С#
Я изучаю С# и поймаю фрагмент кода, который я не понимаю. Я надеялся, что вы сможете его очистить для меня.
CreateCustomerTask.<>c__DisplayClass0 cDisplayClass0 =
new CreateCustomerTask.<>c__DisplayClass0();
Что означает <>
? И почему перед ним стоит .
(точка)?
Ответы
Ответ 1
Вы просматриваете какой-то декомпилированный код - в частности, то, что было создано компилятором.
Компилятор использует <>
(это деталь реализации), потому что, хотя он действителен для идентификатора CLR для начала с такими символами, он недействителен на С#, поэтому он гарантировал, что имя не будет конфликтовать с любыми именами в код С#.
почему компилятор сгенерировал этот код, меняется - это может быть реализация лямбда или итератора или асинхронного блока и, возможно, некоторые другие причины.
И, надеюсь, на другую часть вашего вопроса также будет дан ответ - там .
перед ним по обычным причинам - отделить части пространства имен или, более вероятно, в этом случае отделить имя вложенного класса от имени охватывающего класса.
Ответ 2
Как указывали другие, вы видите имя, сгенерированное компилятором, который намеренно не является законным С#, так что никто не может случайно (или преднамеренно!) вызывать конфликт имен.
Причина создания этого имени заключается в том, что:
class C
{
void M()
{
int x = 1;
Func<int, int> f = y=>x+y;
}
}
Генерируется компилятором, как если бы вы написали:
class C
{
private class DisplayClass
{
public int x;
public int AnonymousMethod(int y)
{
return this.x + y;
}
}
void M()
{
C.DisplayClass d = new C.DisplayClass();
d.x = 1;
Func<int, int> f = d.AnonymousMethod;
}
}
Кроме того, конечно, все имена намеренно искалечены, как вы обнаружили.
Причина, по которой класс закрытия называется "DisplayClass", немного неудачна: это жаргон, используемый командой отладчика для описания класса, который имеет особое поведение при отображении в отладчике. Очевидно, что мы не хотим отображать "x" в качестве поля класса с невозможным именем при отладке вашего кода; скорее, вы хотите, чтобы он выглядел как любая другая локальная переменная. В отладчике есть специальная передача для обработки этого класса отображения. Вероятно, его, скорее всего, назовем "ClosureClass", чтобы было проще читать разборку.
Ответ 3
Используйте этот ответ Эрика Липперта для декодирования имен, таких как <>c__DisplayClass0
. Согласно таблице, приведенной в ответе, вы смотрите на класс анонимного метода закрытия. Не полагайтесь на то, что это всегда будет правдой в будущем, это детали реализации, которые могут быть изменены в любое время.