Учебно-методический комплекс общее количество часов 58 ч. Лекции 28 ч


Область видимости переменных. Вложенные блоки


Download 2.46 Mb.
bet21/91
Sana19.10.2023
Hajmi2.46 Mb.
#1709453
TuriУчебно-методический комплекс
1   ...   17   18   19   20   21   22   23   24   ...   91
Bog'liq
Язык программирования C#

5.5. Область видимости переменных. Вложенные блоки

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


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

Приведем пример поясняющий вышесказанное.


static int Before()


{
//return i;
int i = 0;
return i;
}
Лист. 5.8

В закомментированной строке кода я пытаюсь обратиться к еще не существующей переменной, поэтому если раскомментировать эту строку, то компилятор выдаст ошибку.


Error 1 The name 'i' does not exist in the current context


Так как память под локальные переменные выделяется и освобождается автоматически, то из одного метода нельзя обратиться к переменным другого, а разные методы могут содержать одноименные переменные никак не связанные друг с другом. Иными словами области видимости локальных переменных разных методов никак не связаны.


Приведем простой пример иллюстрирующий выше сказанное.


static void Proc1()


{
double a = 0;
//Console.Write(b);
}

static void Proc2()


{
double b = 1;
//Console.Write(a);
}
Лист. 5.9

В этом примере закомментированы обращения к невидимым для методов переменным. Если раскомментировать эти строки кода, то компилятор вернет следующие сообщения об ошибках.


Error 1 The name 'b' does not exist in the current context


Error 2 The name 'a' does not exist in the current context

static void Proc3()


{
double a = 0;
Console.Write(a);
}

static void Proc4()


{
int a = 1;
Console.WriteLine(a);
}
Лист. 5.10

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


Инструкции внутри метода могут быть сгруппированы посредствам блоков кода, ограниченных фигурными скобками. В блоке кода может содержаться от нуля до бесконечности инструкций. Каждый блок определяет свое пространство видимости. Формальные параметры относятся к основному пространству видимости метода.


Среди прочих инструкций блоки могут содержать определения переменных. Имена переменных, определяемых в блоках, не могут совпадать с именами определенными в пространстве имен, в котором находится блок. В языках C и C++ такой прием был возможен, он назывался перекрытием и часто приводил к ошибкам.

Следующий пример поможет понять вышесказанное.


static void Main(string[] args)


{
{
int i = 0;
if (i == 0)
{
//float i;
double b = 0;
while (b < 10)
{
int c;
{
//string c;
}
b += 1;
}
}
}
}
Лист. 5.11

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


Если их раскомментировать, компилятор выдаст следующие ошибки.

Error 1 A local variable named 'i' cannot be declared in this scope because it would give a different meaning to 'i', which is already used in a 'parent or current' scope to denote something else


Error 2 A local variable named 'c' cannot be declared in this scope because it would give a different meaning to 'c', which is already used in a 'parent or current' scope to denote something else

Внутри блока доступны все переменные из внешних блоков и переменные объявленные внутри самого блока.


Проиллюстрируем это следующим примером.


static void ScopeView(string Arg)


{
int a = 1;
for (int i = 0; i < 10; i++)
{
Console.WriteLine(a + Arg);
{
double b = 10;
Console.Write(b * a * i);
}
//Console.Write(b + a);
}
//i = 0;
}
Лист. 5.12

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


Если их раскомментировать, компилятор выдаст следующие ошибки.

Error 1 The name 'b' does not exist in the current context


Error 2 The name 'i' does not exist in the current context





Download 2.46 Mb.

Do'stlaringiz bilan baham:
1   ...   17   18   19   20   21   22   23   24   ...   91




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling