C# автоматическое свойство

Автоматическое свойство С# 3.0 полностью заменяет свойство field?

Я имею в виду, что я могу напрямую использовать свойство вместо того, чтобы хранить его, поскольку свойство служит частным резервным полем (извините, я понимаю только так).

int a;

public int A
{
  get;set;
 }

person user196546    schedule 14.11.2009    source источник
comment
Пожалуйста, сохраните свой ответ. Не удаляйте его.   -  person user196546    schedule 14.11.2009
comment
generixs: В будущем я бы попросил вас не выбирать первый правильный ответ, который вы видите. Многих из нас расстраивает, когда новички делают это, потому что это, как правило, поощряет быстрые ответы и препятствует, возможно, лучшим ответам, которые требуют больше времени для ввода, что противоречит основной цели StackOverflow.   -  person Ray Burns    schedule 14.11.2009
comment
@РэйБёрнс. Извините, я буду избегать этого в будущем. Еще раз извините.   -  person user196546    schedule 14.11.2009


Ответы (3)


Когда вы получаете доступ к свойству из кода, будь то внутри или вне класса, доступ к нему всегда осуществляется как к свойству. В большинстве случаев это неважно, но это действительно означает, что вы не можете передать его по ссылке, что вы могли бы сделать, если бы это было поле.

Единственная часть кода, которая обращается к резервному полю напрямую (не считая рефлексии), — это само свойство.

Это свойство, чистое и простое. Оно недоступно как поле — оно доступно как свойство. Компилятор 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
comment
Вы хотите сказать, что при использовании свойства я не могу сделать (ссылка A), если бы A было свойством. Правильно? - person user196546; 14.11.2009
comment
Пожалуйста, смотрите мой комментарий. теперь должно было быть нет (иначе немного об отражении немного избыточно). - person Brian Rasmussen; 14.11.2009
comment
Обычно я видел нотацию Foo‹int› ... Но что означает private int‹› Foo? Я имею в виду угловую скобку после int (т.е.) int‹› и ‹›Foo ..? - person user196546; 14.11.2009
comment
Это имя поля: <>Foo. Компилятор C# намеренно использует угловые скобки, чтобы сделать имя невыразимым, т. е. таким, которое на самом деле недопустимо в C#, но подходит для CLR. Это означает, что гарантированно не будет коллизии с обычным элементом, и вы не сможете получить к нему доступ в коде. Однако точное имя зависит от реализации — не рассчитывайте, что оно будет называться <>, за которым следует имя свойства. (Я даже не проверял, произойдет ли это сейчас, но что-то в этом роде будет.) - person Jon Skeet; 14.11.2009

Да, автоматическое свойство имеет собственное поле хранения.

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

Дополнительные сведения см. в этом руководстве: http://msdn.microsoft.com/en-us/library/bb384054.aspx

person Brian Rasmussen    schedule 14.11.2009
comment
Извините, Nescio ответил первым. Поэтому я отметил его ответ. - person user196546; 14.11.2009
comment
Без проблем. Вы выбираете ответ, который вы предпочитаете. - person Brian Rasmussen; 14.11.2009
comment
Я не согласен с тем, что теперь он доступен как поле - это предполагает, что вы можете передать его по ссылке. Это свойство с собственным закрытым резервным полем, к которому никто другой не может получить доступ. - person Jon Skeet; 14.11.2009
comment
@Джон, ты прав. Глупая опечатка. Я хотел сказать, что нет в наличии. Спасибо. - person Brian Rasmussen; 14.11.2009
comment
О, это имеет больше смысла :) - person Jon Skeet; 14.11.2009

Здесь задействована некоторая магия компилятора, например, с делегатами и так далее. Вы можете видеть это так, как будто компилятор берет на себя ответственность за создание необходимого кода, который в противном случае вам пришлось бы вводить явно.

person Simón    schedule 14.11.2009