Этот код успешно проходит процедуру компиляции и выдает следующий результат:
Данная программа выполняет следующие действия:
• В функции Main () описывается и инициализируется переменная с именем myString.
• Функция Main () передает управление функции Write().
• В функции Write () описывается и инициализируется переменная с именем myString, отличная от переменной с именем myString, описанной в функции Main().
• Функция Write () выводит на консоль строку, содержащую то значение переменной mystring, которое ей присвоено в функции Write() .
• Функция Write() возвращает управление функции Main().
• Функция Main () выводит на консоль строку, содержащую то значение переменной myString, которое ей присвоено в функции Main ().
Переменные, область действия которых распространяется только на одну функцию, называются локальными.Существует возможность описания глобальных переменных, чья область действия охватывает сразу несколько функций. Внесите в программу следующие изменения:
В данном случае будет получен следующий результат:
На этот раз мы включили в код еще одну переменную с именем myString, изменив иерархию имен в программе. Эта переменная описана следующим образом:
static string myString;
Обратите внимание, что нам вновь потребовалось использовать ключевое слово static. Мы не будем вдаваться в детали: на данном этапе достаточно знать, что для консольных приложений данного типа в описании глобальных переменных обязательно использование либо ключевого слова static, либо ключевого слова const. Если мы планируем изменять значение глобальной переменной, то обязательным является ключевое слово static, так как const запрещает любые изменения значения переменной.
Для того чтобы отличать глобальную переменную от локальных переменных с тем же именем в функциях Main() и Write() , нам необходимо классифицировать имя глобальной переменной, используя полностью квалифицированное имя. В данном случае мы обращаемся к глобальной переменной по имени Classl.myString. Обратите внимание, что это необходимо делать только в том случае, если существуют глобальная и локальная переменные с одинаковым именем; если бы локальной переменной с именем myString не существовало, то мы совершенно свободно могли бы использовать для обращения к глобальной переменной имя myString вместо Classl.myString. В том случае, когда используется локальная переменная, имя которой совпадает с именем глобальной переменной, говорят, что глобальная переменная является скрытой.
Значение глобальной переменной задается в функции Main ():
Теперь непонятно, почему всегда не прибегаем к такому способу обмена данными с функциями. Действительно, существуют определенные ситуации, когда этот способ передачи данных оказывается более предпочтительным, однако имеется не меньшее (если не большее) число ситуаций, когда он менее удобен. Стоит ли применять глобальные переменные, зависит от способа использования каждой конкретной функции. Проблема глобальных переменных заключается в том, что они, по большому счету, оказываются непригодными для функций "общего назначения", которые способны работать с любыми передаваемыми им данными и не ограничиваются данными, задаваемыми конкретной глобальной переменной.