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

Значение <> в С#

Я изучаю С# и поймаю фрагмент кода, который я не понимаю. Я надеялся, что вы сможете его очистить для меня.

CreateCustomerTask.<>c__DisplayClass0 cDisplayClass0 =
         new CreateCustomerTask.<>c__DisplayClass0();

Что означает <>? И почему перед ним стоит . (точка)?

4b9b3361

Ответ 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. Согласно таблице, приведенной в ответе, вы смотрите на класс анонимного метода закрытия. Не полагайтесь на то, что это всегда будет правдой в будущем, это детали реализации, которые могут быть изменены в любое время.