Книга: ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание

Синтаксис инициализации членов-переменных

Синтаксис инициализации членов-переменных

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

// Все это хорошо, но такая избыточность…
class Test {
 public int myInt;
 public string myString;
 public Test() {myInt = 9;}
 public Test(string s) {
  myInt = 9;
  myString = s;
 }
}

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

// Все равно остается избыточность…
class Test {
 public int myInt;
 public string myString;
 public Test() {InitData();}
 public Test(string s) {
  myString = s;
  InitData();
 }
 private void InitData() {myInt = 9;}
}

Оба эта подхода вполне легитимны, но в C# позволяется назначать членам типа начальные значения в рамках деклараций (вы, наверное, знаете, что другие объектно-ориентированные языки [например, C++], не позволяют такую инициализацию членов). В следующем фрагменте программного кода обратите внимание на то, что инициализация может выполняться и для внутренних объектных ссылок, а не только для числовых типов данных.

// Если нужно отказаться от значений, предусмотренных по умолчанию,
// эта техника позволяет избежать повторной записи программного
// хода инициализации в каждом конструкторе.
class Test {
 public int myInt = 9;
 public string myStr = "Мое начальное значение. ";
 public SportsCar viper = new SportsCar(Color.Red);
 ...
}

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

Оглавление книги

Оглавление статьи/книги

Генерация: 1.198. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз