Инициализация авто-свойств C# [дубликат]


этот вопрос уже есть ответ здесь:

  • Как вы даете авто-свойству C# значение по умолчанию? 21 ответов

Я привык писать такие классы:

public class foo {
  private string mBar = "bar";
  public string Bar {
    get { return mBar; }
    set { mBar = value; }
  }
  //... other methods, no constructor ...
}

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

public class foo2theRevengeOfFoo {
  //private string mBar = "bar";
  public string Bar { get; set; }
  //... other methods, no constructor ...
  //behavior has changed.
}

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

что-то вроде этого будет иметь больше смысла для меня:

public string Bar { get; set; } = "bar";
4 168

4 ответа:

обновление - ответ ниже был написан до того, как появился C# 6. В C# 6 Вы можете написать:

public class Foo
{
    public string Bar { get; set; } = "bar";
}

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

public class Foo
{
    public string Bar { get; }

    public Foo(string bar)
    {
        Bar = bar;
    }
}

жаль, что нет никакого способа сделать это прямо сейчас. Вы должны установить значение в конструкторе. (Использование цепочки конструкторов может помочь избежать дублирование.)

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

это не произошло до и включая C# 5, но планируется для C# 6-как с точки зрения разрешения инициализации в точке объявления, и позволяет инициализировать автоматически реализуемые свойства только для чтения в теле конструктора.

Вы можете сделать это через конструктор класса:

public class foo {
  public foo(){
    Bar = "bar";
  }
  public string Bar {get;set;}
}

Если у вас есть другой конструктор (т. е. тот, который принимает параметры) или куча конструкторов вы всегда можете иметь это (так называемый конструктор цепочки):

public class foo {
  private foo(){
    Bar = "bar";
    Baz = "baz";
  }
  public foo(int something) : this(){
    //do specialized initialization here
    Baz = string.Format("{0}Baz", something);
  }
  public string Bar {get; set;}
  public string Baz {get; set;}
}

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

это возможно в C# 6.0:

public int Y { get; } = 2;

в конструкторе по умолчанию (и любые нестандартные, если у вас тоже есть):

public foo() {
    Bar = "bar";
}

Это не менее эффективно, чем ваш исходный код, я считаю, так как это то, что происходит за кулисами в любом случае.