2009-08-19 3 views
3

Обратите внимание, что следующий код в классе один классИспользуйте частные или эксплуатационные свойства? C#

private string _fee; 
private string _receipt; 

public string Fee 
{ 
    get { return _fee; } 
    private set { _fee = value; } 
} 

public string Receipt 
{ 
    get { return _receipt; } 
    private set { _receipt = value;} 
} 

public MyValue(string fee, string receipt) : this() 
{ 
    _fee = int.Parse(receipt).ToString(); 
    _receipt = receipt; 
} 

Как вы можете видеть мою собственность ничего не делает, так что я должен использовать

_fee = int.Parse(fee).ToString(); 
_receipt = receipt; 

или

Fee = int.Parse(fee).ToString(); 
Receipt = receipt; 
+0

О, это первый скрипт, который я использую с ReSharper. я просто люблю это! –

ответ

16

Используйте свойства, и если вы на C# 3 вы должны использовать автоматически реализуемые свойства, как это:

public string Fee 
{ 
    get; private set; 
} 

public string Receipt 
{ 
    get; private set; 
} 

public MyValue(string fee, string receipt) : this() 
{ 
    this.Fee = int.Parse(fee).ToString(); 
    this.Receipt = receipt; 
} 
10

I всегда будет использовать свойства - это дает вам большую гибкость:

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

Кроме того, похоже, что отражение .NET ведет себя несколько иначе по свойствам по сравнению с полями, поэтому, если у вас есть сочетание свойств и полей, вам нужно знать об этих тонкие различия - если вы используете только свойства, y ou're good to go :-)

Внутри класса вы можете использовать поле хранилища резервных копий или свойство - если вы используете свойство, любые побочные эффекты, которые может иметь ваш сеттер (обновление других полей, ведение журнала вашего звонка и т. д.), - если вы напрямую обращаетесь к полю резервного хранилища, вы обходите их. Это может быть хорошим или плохим - зависит от вашего сценария. Просто знайте, что вы делаете! :-)

Marc

+0

+1, но я бы добавил «без нарушения бинарной совместимости» к вашему первому пункту и комментариям отражения. В противном случае вы все равно можете просто перераспределить частное поле. –

+0

Я начал задаваться вопросом, должен ли компилятор C# даже разрешать публичные поля. Кажется, нет причин использовать их. –

4

В данном случае это не имеет значения, как если вы согласны в своем коде.

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


Редактировать: Просто пояснить, я просто имею в виду различия в подходе к примеру OP. marc_s дает несколько замечаний относительно того, почему свойства могут быть выгодными для большинства ситуаций.

0

Я бы всегда использовал членов напрямую.

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

Это может стать еще хуже, если свойства являются виртуальными, как указано в матерях.