Когда вы получаете доступ к свойству из кода, будь то внутри или вне класса, доступ к нему всегда осуществляется как к свойству. В большинстве случаев это неважно, но это действительно означает, что вы не можете передать его по ссылке, что вы могли бы сделать, если бы это было поле.
Единственная часть кода, которая обращается к резервному полю напрямую (не считая рефлексии), — это само свойство.
Это свойство, чистое и простое. Оно недоступно как поле — оно доступно как свойство. Компилятор C# не заменяет доступ к нему доступом к полю. Доступ к нему всегда является доступом к свойству. Конечно, он может быть встроен компилятором JIT, но в этом нет ничего особенного. Что касается CLR, это просто обычное свойство (к которому применяется атрибут [CompilerGenerated]
).
Но чтобы ответить на ваш первоначальный вопрос - да, автоматическое свойство означает, что вам не нужно самостоятельно объявлять резервное поле. Эффективно это:
public int Foo { get; set; }
переводится на
private int <>Foo; // Or some other unspeakable name
public int Foo
{
get { return <>Foo; }
set { <>Foo = value; }
}
Вы не можете получить доступ к сгенерированному полю непосредственно в коде C#, так как оно имеет невыразимое имя. Вы увидите, что оно присутствует, если изучите тип с отражением — CLR не делает различий между автоматически реализованным свойством и «обычным».
person
Jon Skeet
schedule
14.11.2009