2009-11-14 3 views
3

Является ли автоматическое свойство C# 3.0 полностью замененным поданным?C# автоматическое свойство

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

int a; 

public int A 
{ 
    get;set; 
} 
+0

Пожалуйста, сохраняйте ваш ответ. Не удаляйте его. – user196546

+2

generixs: В будущем я прошу вас, пожалуйста, не просто выбрать первый правильный ответ, который вы видите. Это разочаровывает для многих из нас, когда новички делают это, потому что он, как правило, поощряет быстрые ответы и препятствует возможным лучшим ответам, которые занимают больше времени, что наносит ущерб основной цели StackOverflow. –

+0

@ RayBurns. Извините, я буду избегать этого в будущем. Снова жаль. – user196546

ответ

7

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

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

Это свойство, чистое и простое. Он недоступен в качестве поля - он доступен как собственность. Компилятор 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 не проводит различия между автоматически реализованным свойством и «нормальным».

+0

Вы хотите сказать, что при использовании свойства я не могу сделать (ref A), если A был свойством .right? – user196546

+0

@generixs: Точно. –

+0

См. Мой комментарий. «now» должно быть «не» (иначе бит о отражении немного избыточен). –

7

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

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

Пожалуйста, смотрите это руководство для получения дополнительной информации: http://msdn.microsoft.com/en-us/library/bb384054.aspx

+0

Извините, Nescio ответил первым. Так я пометил его ответ. – user196546

+0

Нет проблем. Вы выбираете ответ, который вы предпочитаете. –

+0

:) Спасибо за ваше великодушие – user196546

0

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