Авто-свойства с или без поля поддержки - предпочтение?
Я знаю, что при использовании авто-свойств компилятор создает свое собственное поле под экраном. Тем не менее, во многих программах, которые я читаю, чтобы учиться, я вижу, что люди явно пишут
private int _backingField;
public int Property { get { return _backingField; } }
В чем разница между сверху и снизу?
public int Property { get; private set; }
Я понимаю, что использование свойства очевидно, когда у вас действительно есть побочные эффекты в геттере или сеттере, но часто это не так. Также я понимаю, что вы должны явно использовать поле поддержки в случае структур, вы не можете получить доступ к их членам через свойства.
Единственное отличие, которое я смог найти, заключается в том, что способ вызова значения отличается от класса, в котором он определен. Является ли это простым предпочтением, или есть что-то большее, чем вызов значения через его свойство или прямой доступ к поле? Простые соглашения?
1 ответ
Между этими двумя фрагментами нет большой разницы - например, вы не можете передать свойство по ссылке, но это редко является проблемой. Однако, если вы хотите, чтобы поле было доступно только для чтения, вот так:
private readonly int _backingField;
public int Property { get { return _backingField; } }
тогда есть разница. Код, который я написал выше, предотвращает изменение значения в другом месте в классе, давая понять, что на самом деле он должен быть неизменным. Я бы очень хотел иметь возможность объявить поле только для чтения с автоматически реализуемым свойством только для чтения, которое можно установить только внутри конструктора, но в данный момент оно недоступно.
Кстати, это довольно странно:
Также я понимаю, что вы должны явно использовать поле поддержки в случае структур, вы не можете получить доступ к их членам через свойства.
Что вы имеете в виду? Вы можете определенно использовать свойства в структурах. Вы говорите о полях поддержки, которые являются изменяемыми структурами, то есть разница между:
foo.someField.X = 10;
а также
foo.SomeProperty.X = 10;
? Если так, я обычно избегаю этой проблемы, делая мои структуры неизменными для начала:)