Значение <> в C#
Я изучаю C# и поймал кусок кода, который я не понимаю. Я надеялся, что вы сможете прояснить это для меня.
CreateCustomerTask.<>c__DisplayClass0 cDisplayClass0 =
new CreateCustomerTask.<>c__DisplayClass0();
Что это <>
означает? И почему там .
(точка) перед ним?
3 ответа
Вы смотрите на некоторый декомпилированный код - в частности, на то, что было сгенерировано компилятором.
Компилятор использует <>
(это подробности реализации), поскольку, хотя идентификатор CLR может начинаться с таких символов, он недопустим в C# - поэтому гарантируется, что имя не будет конфликтовать с какими-либо именами в коде C#.
почему компилятор сгенерировал этот код, может быть разным - это может быть реализация лямбды, итератора или асинхронного блока, и, возможно, некоторые другие причины.
И, надеюсь, на другую часть вашего вопроса также ответили - есть .
перед ним по обычным причинам - для разделения частей пространства имен, или, более вероятно, в этом случае, для отделения имени вложенного класса от имени включающего класса.
Как уже отмечали другие, вы видите имя, сгенерированное компилятором, которое намеренно не является допустимым C#, так что никто не может случайно (или намеренно!) Вызвать конфликт имен.
Причина, по которой это имя генерируется, потому что;
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", чтобы было легче читать разборки.
Используйте этот ответ Эрика Липперта для расшифровки имен, таких как <>c__DisplayClass0
, Согласно таблице, приведенной в ответе, вы смотрите на класс закрытия анонимных методов. Не полагайтесь на то, что это всегда будет правдой в будущем, это детали реализации, которые могут быть изменены в любое время.