Установка свойства или поля, когда внутри класса? - PullRequest
3 голосов
/ 25 февраля 2011

Ну, я изучаю свойства, и я не уверен в следующем:

class X
{
  private int y;

  public X(int number)
  {
    this.Y=number; // assign to property
    OR
   this.y=number //?
  }

  public int Y;
  {
    get; set;  
  }

}

Ответы [ 7 ]

1 голос
/ 25 февраля 2011

Присваивать только полю (private int y) внутри свойства, представляющего это поле (public int Y {get; set}). Нет, где еще в классе следует непосредственно назначать поле поддержки,Всегда делайте это через свойство ... да даже в конструкторе.Это следует из принципа «Не повторяй себя» ( DRY ).

Это рекомендуется, потому что всякий раз, когда в будущем вы захотите связать какое-то поведение, которое будет вызвано этим назначением, у вас есть только одно место (метод доступа set) для записи кода в ....не все места, где поле назначено !!

   class X   
   {   
    private int y; //not strictly necessary but good for documentation

    public X(int number)
    {
        Y = number;
    }

    public int Y { get; set; }


    }
1 голос
/ 25 февраля 2011

Они делают разные вещи;Я бы Y = number; и удалил (неиспользованное) поле y.В автоматически реализованном свойстве компилятор создает свое собственное поле (с ужасным именем, которое вы не видите в C #) - вам не нужно предоставлять свое собственное поле.Итак:

class X
{
  public X(int y)
  {
    Y = y;
  }
  public int Y { get; set; }    
}

Другие пункты: изменено number на y, чтобы быть более понятным для вызывающего, а также вам не нужно this., так как оно не является неоднозначным (поле против параметраи т.д.).

1 голос
/ 25 февраля 2011

Когда вы используете авто-свойства (get; set; или их вариант), переменная поддержки недоступна.По большей части они могут рассматриваться как простые переменные, особенно внутренние.

Если вам нужно выполнить пользовательскую проверку или логику мутации в мутаторе или иным образом требовать явной вспомогательной переменной, вы не можетеиспользуйте авто-свойства, но вы должны сами написать методы stub get и set.

0 голосов
/ 25 февраля 2011

Я обычно пытаюсь сделать вывод о доступе к вспомогательным переменным:

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

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

class X   
   {   
     private int y; //not strictly necessary but good for documentation

    public X(int number)
    {
        y = GetYValueFromDB();  //we assume the value from DB is already valid

    }

    public int Y { 
       get{ return y}; 
       set { 
       if (ComplexValidation(value)
         {
           RaiseOnYPropertyChanged();
           y = value;
         }
        }


    }
0 голосов
/ 25 февраля 2011

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

0 голосов
/ 25 февраля 2011

У вас есть два варианта:

class X
{
    private int y;

    public int Y
    {
        get { return y; }
        set { y = value; }
    }

    public X(int number)
    {
        Y = number;
        //equivalent to 
        y = number;
        // but you should use the public property setter instead of the private field
    }
}

или с автоматическими свойствами, это еще проще:

class X
{
    private int y;

    public int Y
    {
        get; set;
    }

    public X(int number)
    {
        Y = number;
    }
}
0 голосов
/ 25 февраля 2011

Когда вы используете autoproperties, как:

  public int Y;
  {
    get; set;  
  }

Вам не нужна частная собственность, потому что она автоматически сгенерирована. Поэтому ваш класс будет:

class X
{   
  public X(int number)
  {
    Y = number;
  }

  public int Y // no semicolon here, comment added for edit length
  {
    get; set;  
  }
}

Надеюсь, это поможет

...