|
Программирование >> Программирование с использованием ajax
Описание полученных результатов Что же пошло не так? Дело в том, что переменная myString, определенная в основном теле приложения (в функции Main ()), не доступна внутри функции Write (). Объясняется такая недоступность тем, что у всех переменных имеется область видимости, в пределах которой они являются действительными. Область видимости охватывает блок кода, в котором переменная определяется, а также любые блоки, непосредственно вложенные в него. Блоки кода в функциях идут отдельно от блоков кода, из которых они вызываются. Внутри функции Write () имя myString нигде не определено, а раз так, то получается, что переменная myString, определенная в Main (), находится за пределами области видимости, т.е. может использоваться только в пределах функции Main О. Тем не менее, в функции Write () может присутствовать своя, совершенно отдельная переменная по имени myString. Попробуйте изменить предыдущий код, как показано ниже: class Program { static void Write О { string myString = String defined in Write () ; Строка, определенная в функции Write() Console.WriteLine ( Now in Write () ) ; Теперь в функции Write () Console.WriteLine( myString = {0} , myString); static void Main(string[] args) { string myString = String defined in MainO ; Write 0; Console.WriteLine( \nNow in Main() ) ; Console.WriteLine ( myString = {0} , myString); Console.ReadKey() ; Этот код успешно скомпилируется и приведет к получению вывода, показанного на рис. 6.4. Ниже перечислены действия, выполняемые этим кодом. □ Сначала функция Main () определяет и инициализирует строковую переменную по имени myString. а Затем функция Main () передает управление функции Write (). □ Функция Write О определяет и инициализирует строковую переменную myString, которая отличается от той, что была определена в Main (). □ Далее функция Write () выводит на консоль строку, содержащую значение той переменной myString, которая была определена в ней. □ После этого функция Write () передает управление обратно функции Main (). □ Функция Main О выводит на консоль строку, содержащую значение той переменной myString, которая была определена в ней. Переменные, область видимости которых распространяется подобным образом только на одну единственную функцию, называются локальными переменными. Однако также допускается использовать и глобальные переменные, область видимости которых распространяется на несколько функций. Попробуйте изменить код следующим образом: class Program { static string myString; static void Write () { string myString = String defined in WriteO ; Console.WriteLine ( Now in WriteO ); Console.WriteLine ( Local myString = {0} , myString) ; Локальная переменная Console.WriteLine ( Global myString = {0} , Program.myString) ; Глобальная переменная static void Main(string [ ] args) { string myString = String defined in MainO ; Program.myString = Global string ; WriteO ; Console.WriteLine( \nNow in Main() ); Console.WriteLine ( Local myString = {0} , myString); Console.WriteLine ( Global myString = {0} , Program.myString) ; Console.ReadKey0 ; Результат, который получится в этом случае, показан на рис. 6.5 Здесь была добавлена еще одна переменная с именем myString, на этот раз чуть выше в иерархии имен в коде. Определение этой переменной выглядит следующим образом: static string myString; Обратите внимание на то, что здесь опять присутствует ключевое слово static. Вкратце это объясняется тем, что в консольном приложении такого типа для глобальных переменных подобного вида нужно обязательно использовать либо ключевое слово static, либо ключевое слово const. При желании изменить значение глобальной переменной, следует применять именно ключевое слово static, поскольку const не допускает изменения значения переменной. Чтобы различить данную глобальную переменную и локальные переменные с таким же именем в функциях Main () и Write (), необходимо использовать для нее полностью квалифицированное имя, как было описано в главе 3. Рис. 6.4. Вывод после изменения кода Рис. 6.5. Использование локальных и глобальных переменных Здесь для ссылки на глобальную переменную используется имя Program.myString. Подобное необходимо делать только в том случае, когда есть и глобальные, и локальные переменные с одинаковыми именами; если бы локальной переменной myString не было, для обозначения глобальной переменной можно было бы применять и просто myString, а не Program.myString. При наличии локальной переменной с таким же именем, как и у глобальной, глобальная переменная считается скрытой. Значение глобальной переменной устанавливается в функции Main () с помощью такой строки кода: Program.myString = Global string ; Доступ к ней осуществляется в функции Write () следующим образом: Console.WriteLine( Global myString = {0} , Program.myString); Может возникнуть вопрос, почему нельзя просто использовать этот прием для обмена данными с функциями вместо показанного ранее приема с передачей параметров? На самом деле бывают ситуации, когда такой подход действительно является предпочтительным способом для обмена данными, но часто случается, что это не так. Выбор того, стоит ли применять глобальные переменные, зависит от предполагаемого использования задействованной функции. Проблемой глобальных переменных является то, что они обычно не подходят для универсальных функций, способных работать с любыми передаваемыми им данными, а не только с теми, что содержатся в конкретной глобальной переменной. Об этом более подробно будет рассказываться позже в главе. Область видимости переменных в других структурах Прежде чем продолжить, нужно обязательно обратить внимание на то, что один из описанных в предьщущем разделе моментов влияет не только на область видимости переменных между функциями. Было сказано, что области видимости переменных охватывают как те блоки кода, в которых они определяются, так и любые непосредственно вложенные в них блоки. Это также касается и других блоков, вроде тех, что содержатся в структурах типа ветвлений и циклов. Рассмотрим следующий код: int i; for (i = 0; i < 10; i++) { string text = Line + Convert.ToString(i); Console.WriteLine( {0} , text); Console.WriteLine( Last text output in loop: {0} , text); Вывод в цикле последних введенных текстовых данных Здесь строковая переменная text является локальной по отношению к циклу for. Скомпилировать этот код не получится, поскольку вызов функции Console. WriteLine (), происходящий за пределами данного цикла, приведет к попытке использования переменной text, что будет уже за рамками ее области видимости, поскольку эта операция происходит за пределами цикла. Давайте попробуем изменить этот код следующим образом: int i; string text; for (i = 0; i < 10; i++) { text = Line + Convert.ToString(i); Console.WriteLine ( {0} , text); Console.WriteLine( Last text output in loop: {0} , text);
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |