Авто-свойства с или без подложки - предпочтение? - PullRequest
11 голосов
/ 10 марта 2012

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

private int _backingField;

public int Property { get { return _backingField; } }

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

public int Property { get; private set; }

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

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

1 Ответ

14 голосов
/ 10 марта 2012

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

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

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

Кстати, это довольно странно:

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

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

foo.someField.X = 10;

и

foo.SomeProperty.X = 10;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...