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

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

Типы класса обычно имеют множество членов-переменных (также называемых полями). Если в классе можно определять множество конструкторов, то может возникнуть не слишком радующая программиста необходимость многократной записи одного и того же программного кода инициализации для каждой новой реализации конструктора. Это вполне реально, например, в том случае, когда вы не хотите принимать значение члена, предусмотренное по умолчанию. Так, чтобы член-переменная (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);

 ...

}

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

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

8.5.9 Видимость Имен Членов

Из книги C++ автора Хилл Мюррей

8.5.9 Видимость Имен Членов Члены класса, описанные с ключевым словом class, являюся закрытыми, то есть, их имена могут использоваться только функциями членами (#8.5.2) и друзьями (см. #8.5.10), если они не стоят после метки «public:». В этом случае они являются открытыми. Открытый член


Доступность членов

Из книги Язык программирования С# 2005 и платформа .NET 2.0. [3-е издание] автора Троелсен Эндрю

Доступность членов Прежде чем двигаться дальше, мы должны обсудить вопрос доступности, или "видимости" членов. Члены (методы, поля, конструкторы и т.д.) данного класса или структуры должны указать свой уровень доступности. Если член определяется без указания ключевого


Тестирование переопределенных членов

Из книги Пишем драйвер Windows на ассемблере автора Компьютеры Автор неизвестен -

Тестирование переопределенных членов Теперь можно проверить обновленный класс Person. Добавьте следующий программный код в метод Main() и сравните результат его выполнения с тем, что показано на рис. 3.18.static void Main (string[] args) { // ВНИМАНИЕ: эти объекты должны быть идентичными. Person


Определение членов типов в CIL

Из книги Delphi. Учимся на примерах автора Парижский Сергей Михайлович

Определение членов типов в CIL Вы уже знаете, что типы .NET могут определить различные члены. Перечни содержат некоторый набор пар имен и значений. Структуры и классы могут иметь конструкторы, поля, методы, свойства, статические члены и т.д. В предыдущих 14 главах вы уже могли


Определение параметров членов

Из книги Основы объектно-ориентированного программирования автора Мейер Бертран

Определение параметров членов Теперь предположим, что нужно определить методы, имеющие аргументы. По сути, указание аргументов в CIL (приблизительно) соответствует аналогичной операции в C#. Например, аргумент определяется с помощью указания типа данных после имени


3.2. Процедура инициализации

Из книги Программирование на языке Ruby [Идеология языка, теория и практика применения] автора Фултон Хэл

3.2. Процедура инициализации Каждый драйвер имеет процедуру инициализации . Эта процедура вызывается системой сразу после загрузки драйвера в память.У нас такая процедура называется DriverEntry. Объявим её какDriver Entry proc near public, DriverObject:PDRIVER_OBJECT, RegistryPath:PUNICODE_STRINGDriverObject – это


Определение членов класса

Из книги VBA для чайников автора Каммингс Стив

Определение членов класса Все члены класса по характеру доступа к ним делятся на четыре категории: закрытые (private), защищенные (protected), открытые (public) и опубликованные (published).Элементы класса, определенные в разделе public, без каких-либо ограничений открыты для доступа извне


Перекрытие инициализации по умолчанию

Из книги C++. Сборник рецептов автора Диггинс Кристофер

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


Поиск членов

Из книги автора

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


9.3. Создание безопасного при исключениях списка инициализации

Из книги автора

9.3. Создание безопасного при исключениях списка инициализации ПроблемаНеобходимо инициализировать ваши данные-члены в списке инициализации конструктора, и поэтому вы не можете воспользоваться подходом, описанным в рецепте 9.2.РешениеИспользуйте специальный формат


14.5. Список инициализации членов

Из книги автора

14.5. Список инициализации членов Модифицируем наш класс Account, объявив член _name типа string:#include stringclass Account {public:// ...private:unsigned int _acct_nmbr;double _balance;string _name;};Придется заодно изменить и конструкторы. Возникает две проблемы: поддержание совместимости с первоначальным


17.2. Идентификация членов иерархии

Из книги автора

17.2. Идентификация членов иерархии В разделе 2.4 мы уже упоминали о том, что в объектном проектировании обычно есть один разработчик, который конструирует и реализует класс, и много пользователей, применяющих предоставленный открытый интерфейс. Это разделение


18.3.2. Открытие отдельных членов

Из книги автора

18.3.2. Открытие отдельных членов Когда мы применили закрытое наследование класса PeekbackStack от IntArray, то все защищенные и открытые члены IntArray стали закрытыми членами PeekbackStack. Было бы полезно, если бы пользователи PeekbackStack могли узнать размер стека с помощью такой


18.5.2. Специальная семантика инициализации

Из книги автора

18.5.2. Специальная семантика инициализации Наследование, в котором присутствует один или несколько виртуальных базовых классов, требует специальной семантики инициализации. Взгляните еще раз на реализации Bear и Raccoon в предыдущем разделе. Видите ли вы, какая проблема