Использовать частные или использовать свойства? C # - PullRequest
3 голосов
/ 19 августа 2009

Обратите внимание, что следующий код в классе один класс

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;

Ответы [ 4 ]

16 голосов
/ 19 августа 2009

Используйте свойства, и если вы находитесь на 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 голосов
/ 19 августа 2009

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

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

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

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

Марк

4 голосов
/ 19 августа 2009

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

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

<ч />

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

0 голосов
/ 19 августа 2009

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

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

Может стать еще хуже, если свойства будут виртуальными, как упоминалось в womp.

...