Инициализация автоматических свойств C # [дублировать]

StackOverflow https://stackoverflow.com/questions/169220

Вопрос

Я привык писать подобные классы:

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

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

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

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

Что-то подобное имело бы для меня больше смысла:

public string Bar { get; set; } = "bar";
Это было полезно?

Решение

Обновление - приведенный ниже ответ был написан до появления 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;}
}

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

Это будет возможно в C # 6.0:

public int Y { get; } = 2;

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top