Учебно-методический комплекс общее количество часов 58 ч. Лекции 28 ч
Область видимости переменных. Вложенные блоки
Download 2.46 Mb.
|
Язык программирования 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: |
ma'muriyatiga murojaat qiling