В этой главе рассматриваются только локальные переменные простых встроенных типов данных.
Так называемая область действия переменной, то есть область программы, где можно использовать переменную, начинается в точке ее описания и длится до конца блока, внутри которого она описана. Блок — это код, заключенный в фигурные скобки. Основное назначение блока - группировка операторов. В С# любая переменная описана внутри какого-либо блока: класса, метода или блока внутри метода.
Имя переменной должно быть уникальным в области ее действия. Область дей
ствия распространяется на вложенные в метод блоки, из этого следует, что во
вложенном блоке нельзя объявить переменную с таким же именем, что и в охва
тывающем его, например:
class X // начало описания класса X
{
int А; // поле А класса X
int В; // поле В класса X
void Y() // метод Y класса X
{
int С; // локальная переменная С, область действия - метод Y
int A; // локальная переменная А (НЕ конфликтует с полем А)
{ // ============ вложенный блок 1 ============
int D; // локальная переменная D. область действия - этот блок
|
|
// int А; недопустимо! Ошибка компиляции, конфликт с локальной
// переменной А
С = В; // присваивание переменной С поля В класса X (**)
С = this.А; // присваивание переменной С поля А класса X (***)
} // ============ конец блока 1 ===============
{ // ============ вложенный блок 2 ============
int D; // локальная переменная D. область действия - этот блок
} // ============ конец блока 2 ===============
} // конец описания метода Y класса X
}// конец описания класса X
Давайте разберемся в этом примере. В нем описан класс X, содержащий три элемента: поле А, поле В и метод Y. Непосредственно внутри метода Y заданы две локальные переменные — С и А.
Внутри метода класса можно описывать переменную с именем, совпадающим с полем класса, потому что существует способ доступа к полю класса с помощью ключевого слова this (это иллюстрирует строка, отмеченная символами ***). Таким образом, локальная переменная А не «закрывает» поле А класса X, а вот попытка описать во вложенном блоке другую локальную переменную с тем же именем окончится неудачей (эти строки закомментированы). Если внутри метода нет локальных переменных, совпадающих с полями класса, к этим полям можно обратиться в методе непосредственно (см. строку, помеченную символами **). Две переменные с именем D не конфликтуют между собой, поскольку блоки, в которых они описаны, не вложены один в другой.
СОВЕТ
Как правило, переменным с большой областью действия даются более длинные имена, а для переменных, вся «жизнь» которых — несколько строк исходного текста, хватит и одной буквы с комментарием при объявлении.
В листинге 3.1 приведен пример программы, в которой описываются и выводятся на экран локальные переменные.
|
|
Листинг 3.1. Описание переменных
using System;
namespace ConsoleApplication1
{
class Class1
{
static void Main()
{
int i = 3;
double у = 4.12;
decimal d = 600m;
string s = "Вася";
Console.Write("i = ");
Console.WriteLine(i);
Console.Write("y = ");
Console.WriteLine(у);
Console.Write("d = ");
Console.WriteLine(d);
Console.Write("s = ");
Console.WriteLine(s);
}
}
}
Как вы догадались, метод Write делает то же самое, что и WriteLine, но не переводит строку. Более удобные способы вывода рассмотрены в конце этой главы в разделе «Простейший ввод-вывод» (см. с. 59).
ВНИМАНИЕ
Переменные создаются при входе в их область действия (блок) и уничтожаются при выходе. Это означает, что после выхода из блока значение переменной не сохраняется. При повторном входе в этот же блок переменная создается заново.