Авто-свойства с или без поля поддержки - предпочтение?

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

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;

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

Другие вопросы по тегам