Суббота, 20.04.2024, 04:14
Приветствую Вас Гость | RSS

Лекции

Меню сайта
Форма входа
Категории раздела
ТАУ (Теория автоматического управления) [31]
лекции по ТАУ
Экология [151]
учебник
Бухгалтерский учет и налогообложение в строительстве [56]
Дементьев А.Ю. - Практическое пособие
Психология [104]
Пип
информатика [80]
с# Карли Ватсон
современные стулья [0]
новинки
Поиск

Главная » 2010 » Февраль » 11 » Область действия переменных
00:17
Область действия переменных
Область действия переменных
Возможно, читая предыдущий раздел, вы задавались вопросом, зачем вообще
нужно обмениваться данными с функциями. Ответ заключается в том, что в С#
доступ к переменным может осуществляться только из определенных участков
кода. Принято говорить, что переменная имеет определенную область действия,
в рамках которой она является доступной.
Область действия переменной представляет собой очень важное понятие, кото-
рое лучше всего проиллюстрировать с помощью примера.
Практикум: описание и использование основной функции
1. Внесите следующие изменения в ciassi.cs в приложении ch06Ex0i:
class Classi
static void Write()
Console.WriteLine("myString = {0}", myString);
static void Main (string [] args)
string myString = 'String defined in Main() •;
Write();
2. Откомпилируйте код и обратите внимание на сообщение об ошибке
и на предупреждение, которые появятся в списке заданий:
The name 'myString' does not exist in the class or namespace 'ChO6ExO1 .Classi'
(В данном классе или пространстве имен 'Ch06Ex01.Classr имя 'myString' отсутствует
The variable 'myString' is assigned but its value is never used
Переменой 'myString' присваивается значение, но оно нигде не используется)
Как это работает
Итак, что в данном случае неправильно? А то, что переменная myString, опи-
санная в основном теле приложения (в функции Main о ) , оказывается недоступной
В функции Write ().
Причина этой недоступности кроется в том, что у переменных имеется область,
внутри которой их использование является допустимым. Эта область распростра-
няется на тот блок кода, в котором они описаны, и на все непосредственно вло-
женные в него блоки кода. Блоки кода функций отделены от блоков кода, из которых
они вызываются. Поэтому внутри функции write о имя myString не считается
определенным, а переменная myString, определенная в функции MainO, оказыва-
ется вне области своего действия: она может использоваться только в рамках
функции Main ().
118 Глава 6
На самом деле в функции write о мы могли бы использовать совершенно дру-
гую переменную myString. Попробуйте внести в программу следующие изменения:
class Classl
static void Write()
string myString = 'String defined in Write{)*;
Console.WriteLineCNow in Write() *) ;
Console.WriteLine('myString = {0}*, myString);
static void Main (string [] args)
string myString = "String defined in Main() ";
Write();
•.;.:• Console. WriteLine (' \nNow inMainO*);
Console.WriteLine('myString = {0}", myString);
Этот код успешно проходит процедуру компиляции и выдает следующий результат:
Noil Iii №iteO
iii«/$'tf*irtg ~ String defined in W r i t e О
Now in iiainO
royString ~ Sti*ir*g defined in Halo О
Pi%e$& an.y fcey t& continue
Данная программа выполняет следующие действия:
• В функции Main () описывается и инициализируется переменная
С Именем myString.
• Функция Main о передает управление функции write о.
• В функции write () описывается и инициализируется переменная
С Именем myString, ОТЛИЧНЭЯ ОТ переменной С именем myString,
ОПИСанНОЙ В фуНКЦИИ Main().
• Функция write () выводит на консоль строку, содержащую то значение
переменной mystring, которое ей присвоено в функции write о .
• Функция write о возвращает управление функции MainO.
• Функция Main () выводит на консоль строку, содержащую то значение
Переменной myString, КОТОрОе ей Присвоено В фуНКЦИИ Main ().
Переменные, область действия которых распространяется только на одну функ-
цию, называются локальными. Существует возможность описания глобальных
переменных, чья область действия охватывает сразу несколько функций. Внесите
в программу следующие изменения:
class Classl
static string myString;
Функции 119
static void Write()
{
string myString = "String defined in Write () *;
Console. Wri teLine ("Now in Write () ") ;
Console.WriteLine("Local myString = {О}"-, myString);
Console.WriteLine("Global myString = {0}*, Classl.myString)
}
static void Main(string [] args)
{
string myString = "String defined in Main() ";
Classl.myString = "Global string";
Write();
Console.WriteLine(i'\nNow in Main() *) ;
Console. WriteLine ("Local myString •= {0} * , myString) ;
Console.WriteLine("Global myString = {0}", Classl.myString),
В данном случае будет получен следующий результат:
И C:\BegCSharp\ChapteM
НОУ in WritеО
Local 'royString - String defined in UriteO
Global mjpString = Global string
No'w: in Main О
Local PitjString = String defined in HainO
Glo'bal myString - Global string
Press asi^ key to continue
На этот раз мы включили в код еще одну переменную с именем myString, изменив
иерархию имен в программе. Эта переменная описана следующим образом:
static string myString;
Обратите внимание, что нам вновь потребовалось использовать ключевое сло-
во static. Мы не будем вдаваться в детали: на данном этапе достаточно знать, что
для консольных приложений данного типа в описании глобальных переменных
обязательно использование либо ключевого слова static, либо ключевого
слова const. Если мы планируем изменять значение глобальной переменной, то
обязательным является ключевое слово static, так как const запрещает любые
изменения значения переменной.
Для того чтобы отличать глобальную переменную от локальных переменных
с тем же именем в функциях Main о и write о , нам необходимо классифицировать
имя глобальной переменной, используя полностью квалифицированное имя, кото-
рое описано в главе 3. В данном случае мы обращаемся к глобальной переменной
по имени classl.myString. Обратите внимание, что это необходимо делать только
в том случае, если существуют глобальная и локальная переменные с одинаковым
именем; если бы локальной переменной с именем myString не существовало, то
мы совершенно свободно могли бы использовать для обращения к глобальной пе-
ременной ИМЯ myString вместо Classl .myString. В ТОМ случае, КОГДа ИСПОЛЬЗуется
локальная переменная, имя которой совпадает с именем глобальной переменной,
говорят, что глобальная переменная является скрытой.
120 Глава 6
Значение глобальной переменной задается в функции Main ():
Class!.myString = "Global string*;
и используется в функции write ():
Console.WriteLine("Global myString = {0]*, Classl.myString);
Теперь вы, вероятно, недоумеваете, почему мы всегда не прибегаем к такому
способу обмена данными с функциями. Действительно, существуют определенные
ситуации, когда этот способ передачи данных оказывается более предпочтительным,
однако имеется не меньшее (если не большее) число ситуаций, когда он менее
удобен. Стоит ли применять глобальные переменные, зависит от способа исполь-
зования каждой конкретной функции. Проблема глобальных переменных заключа-
ется в том, что они, по большому счету, оказываются непригодными для функций
"общего назначения", которые способны работать с любыми передаваемыми им
данными и не ограничиваются данными, задаваемыми конкретной глобальной
переменной. Несколько позже мы вернемся к подробному рассмотрению этого
вопроса.




























Категория: информатика | Просмотров: 1199 | Добавил: basic | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *:
Календарь
«  Февраль 2010  »
ПнВтСрЧтПтСбВс
1234567
891011121314
15161718192021
22232425262728
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

krutoto.ucoz.ru
Бесплатный конструктор сайтов - uCoz