Где/что такое приватная переменная в автоматически реализованной собственности?

Нет (явной) ссылки на privateName private variable, которая должна быть скрыта FirstName. Не могли бы вы объяснить, как это работает? Я предполагаю, что есть частная переменная, которая получает и устанавливает. Спасибо.

// auto-implemented property FirstName
public string FirstName { get; set; }

Ответ 1

В основном компилятор преобразует ваш код в нечто вроде этого:

private string <__>firstName;

public string FirstName
{
    get { return <__>firstName; }
    set { <__>firstName = value; }
}

Это вряд ли будет точное имя, но использование угловых скобок в имени важно - потому что это делает его невыразимым именем. (Эта неофициальная терминология, но широко используемая - я не знаю, действительно ли это придумал Эрик Липперт, или же он был первым, кто использовал ее во всем, что я читал.) Это имя, которое не является допустимым идентификатором С# но который CLR вполне доволен. Это имеет два преимущества:

  • Компилятору не нужно беспокоиться об именовании коллизий с вашими идентификаторами
  • Компилятору не нужно беспокоиться о том, пытаетесь ли вы ссылаться на поле в своем собственном коде - вы не можете, потому что имя невыразимо!

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

Ответ 2

да, the compiler creates a private, anonymous backing field that can only be accessed through the property get and set accessors. (c) msdn

РЕДАКТИРОВАТЬ:
Когда вы определяете свойство, компилятор будет испускать 2 метода: get_XXX и set_XXX. Когда компилятор С# видит код, который пытается получить или установить свойство, компилятор фактически выдает вызов одному из этих методов. (c) "CLR через С#"

Ответ 4

Другие ребята ответили на это, но немного больше информации... вы можете найти фоновое поле во время выполнения, используя отражение. Ищите поля с именованием типа < < PropertyName → k__BackingField.

Другое сообщение, которое может помочь: