Читаем Интернет-журнал "Домашняя лаборатория", 2007 №9 полностью

При объявлении простых переменных указывается их тип и список объявителей, где объявитель — это имя или имя с инициализацией. Список объявителей позволяет в одном объявлении задать несколько переменных одного типа. Если объявитель задается именем переменной, то имеет место объявление с отложенной инициализацией. Хороший стиль программирования предполагает задание инициализации переменной в момент ее объявления. Инициализацию можно осуществлять двояко — обычным присваиванием или в объектной манере. Во втором случае для переменной используется конструкция new и вызывается конструктор по умолчанию. Процедура SimpieVars класса Testing иллюстрирует различные способы объявления переменных и простейшие вычисления над ними:

public void SimpleVars()

{

     // Объявления локальных переменных int х, s;

     // без инициализации int у =0, и = 77;

     // обычный способ инициализации

     // допустимая инициализация

     float w1=0f, w2 = 5.5f, w3 =w1 + w2 + 125.25f;

     // допустимая инициализация в объектном стиле

     int z= new int ();

     // Недопустимая инициализация.

     // Конструктор с параметрами не определен

     // int v = new int (77);

          x=u+y; //теперь x инициализирована

     if (x> 5) s = 4;

     for (x=1; x<5; x++)s=5;

     // Инициализация в if и for не рассматривается,

     // поэтому s считается неинициализированной переменной

     // Ошибка компиляции: использование неинициализированной переменной

     // Console.WriteLine("s= {0}",s);

}    // SimpleVars

В первой строке объявляются переменные х и s с отложенной инициализацией. Заметьте (и это важно!), что всякая попытка использовать еще не инициализированную переменную в правых частях операторов присваивания, в вызовах функций, вообще в вычислениях приводит к ошибке уже на этапе компиляции.

Последующие объявления переменных эквивалентны по сути, но демонстрируют два стиля инициализации — обычный и объектный. Обычная форма инициализации предпочтительнее не только в силу своей естественности, но она и более эффективна, поскольку в этом случае инициализирующее выражение может быть достаточно сложным, с переменными и функциями. На практике объектный стиль для скалярных переменных используется редко. Вместе с тем полезно понимать, что объявление с инициализациейint у=0 можно рассматривать как создание нового объекта (new) и вызова для него конструктора по умолчанию. При инициализации в объектной форме может быть вызван только конструктор по умолчанию, другие конструкторы с параметрами для встроенных типов не определены.

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

Откладывать инициализацию не стоит, как показывает пример с переменной s, объявленной с отложенной инициализацией. В вычислениях она дважды получает значение: один раз в операторе if, другой — в операторе цикла for. Тем не менее, при компиляции возникнет ошибка, утверждающая, что в процедуре WriteLine делается попытка использовать неинициализированную переменную s. Связано это с тем, что для операторов if и for на этапе компиляции не вычисляются условия, зависящие от переменных. Поэтому компилятор предполагает худшее — условия ложны, инициализация s в этих операторах не происходит. А за инициализацией наш компилятор следит строго, ты так и знай!

Время жизни и область видимости переменных

Давайте рассмотрим такие важные характеристики переменных, как время их жизни и область видимости. Зададимся вопросом, как долго живут объявленные переменные и в какой области программы видимы их имена? Ответ зависит от того, где и как, в каком контексте объявлены переменные. В языке C# не так уж много возможностей для объявления переменных, пожалуй, меньше, чем в любом другом языке. Открою "страшную" тайну, — здесь вообще нет настоящих глобальных переменных. Их отсутствие не следует считать некоторым недостатком С#, это достоинство языка. Но обо всем по порядку.

Поля

Первая важнейшая роль переменных, — они задают свойства структур, интерфейсов, классов. В языке C# такие переменные называются полями (fields). Структуры, интерфейсы, классы, поля — рассмотрению этих понятий будет посвящена большая часть этой книги, а сейчас сообщу лишь некоторые минимальные сведения, связанные с рассматриваемой темой. Поля объявляются при описании класса (и его частных случаев — интерфейса, структуры). Когда конструктор класса создает очередной объект — экземпляр класса, то он в динамической памяти создает набор полей, определяемых классом, и записывает в них значения, характеризующие свойства данного конкретного экземпляра.

Перейти на страницу:

Похожие книги