Где/что такое приватная переменная в автоматически реализованной собственности?
Нет (явной) ссылки на 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 через С#"
Ответ 3
Компилятор С# создает поле хранилища резервных копий за кулисами, вы можете попытаться декомпилировать его. используя рефлектор. вы узнаете, как он создал поля поддержки.
здесь тот же ответ
Свойство автоматической реализации MSDN
Автореализованное свойство
Ответ 4
Другие ребята ответили на это, но немного больше информации... вы можете найти фоновое поле во время выполнения, используя отражение. Ищите поля с именованием типа < < PropertyName → k__BackingField.
Другое сообщение, которое может помочь: