Авто-свойства с резервным полем или без него - предпочтение?

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

private int _backingField;

public int Property { get { return _backingField; } }

В чем разница между выше и ниже?

public int Property { get; private set; }

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

Единственное отличие, которое мне удалось найти, заключается в том, что способ вызова значения отличается внутри класса, в котором оно определено. Является ли это простым предпочтением, или есть что-то еще для вызова значения через его свойство или путем прямого доступа к поле? Простые условности?


person Taelia    schedule 10.03.2012    source источник


Ответы (1)


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

private readonly int _backingField;    
public int Property { get { return _backingField; } }

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

Кстати, это довольно сбивает с толку:

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

Что ты имеешь в виду? Вы определенно можете использовать свойства в структурах. Вы говорите о вспомогательных полях, которые являются изменяемыми структурами, то есть о разнице между:

foo.someField.X = 10;

и

foo.SomeProperty.X = 10;

? Если это так, я обычно избегаю этой проблемы, делая мои структуры неизменными для начала :)

person Jon Skeet    schedule 10.03.2012
comment
Если взять в качестве примера Vector2 из XNA, если я скажу public Vector2 TheVector {get; набор; } Я не могу вызвать TheVector.X = 10; Вместо этого я должен использовать фактическое поле. Кое-что о передаче по значению / ссылке. (У вас есть материалы для чтения, поясняющие передачу по значению / ссылке для C # в качестве примечания?) - person Taelia; 10.03.2012
comment
Кроме того, если между моими двумя примерами действительно нет разницы, почему так много людей все еще явно создают вспомогательное поле (без реальной цели)? - person Taelia; 10.03.2012
comment
@Taelia: Верно, это случай изменяемой структуры, чего я обычно избегаю. Это потому, что свойство возвращает копию значения. И я не буду пытаться объяснять то, что делают другие люди. - person Jon Skeet; 10.03.2012
comment
Авто-свойства @Taelia были введены в C # 3.0. Это может объяснить, почему некоторые разработчики используют автоматические свойства, а некоторые - нет. Поскольку некоторые разработчики, которые использовали более раннюю версию, могут предпочесть старый способ. - person Terkel; 10.03.2012
comment
Хорошо, спасибо вам обоим. Я видел, как это происходило так часто, что заставил меня задуматься, правильно ли я поступаю, не создавая явных полей. Если это не имеет значения, тогда я продолжу писать код без них. - person Taelia; 10.03.2012