Вопрос№10. Время жизни и область видимости переменных. Где объявляются переменные. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Вопрос№10. Время жизни и область видимости переменных. Где объявляются переменные.



Переменные могут объявляться локально(внутри класса) и гловально(на уровне модуля).

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

Поля. Поля — это переменные, которые задают св-ва структур, интерфейсов, классов. Поля объявляются при описании класса (и его частных случаев интерфейса и структуры). Когда конструктор класса создает очередной объект(экземпляр класса), то в динамической памяти создает набор полей, опред. классом и записывает в них значения, харакериз-е св-ва данного конкретного экземпляра. Так что каждый объект можно рассматривать как набор соответ. полей класса со своими значениями. Тогда время жизни(сущ-я) и обл. видимости полей опред-ся объектом к которому они пренадлежат. Объекты в динамической памяти, с кот. не связанна ни одна ссылочная переменная, становятся недоступными. Реально они заканчивают свое существование, когда сборщик мусора выполнит чистку кучи. Для значимых типов, к кот. принажлежат экземпляры структур, жизнь заканчивается при завершении блока, в кот. они были объявлены.

Некоторые поля могут жить дольше, если при объявлении класса поле было объявленно с модификатором static, то такое поле яв-ся частью класса и единственным на все его экземпляры. Поэтому static-поле живет также долго, как и сам класс.

Вопрос№11.Локальные и глобальные переменные. Переменные, объявленные на уровне процедуры, называются локальными, - они локализованы в процедуре. В некоторых языках, например в Паскале, локальные переменные должны быть объявлены в вершине процедурного блока. В C# переменную можно объявлять в любой точке процедурного блока. Область ее видимости распространяется от точки объявления до конца процедурного блока. В процедурный блок могут быть вложены другие блоки, связанные с операторами выбора, цикла и так далее. В каждом таком блоке, в свою очередь, допустимы вложения блоков (внутр. блоки). Переменные, объявленные во внутр.блоках, локализованы именно в этих блоках, их область видимости и время жизни определяются этими блоками. Лок.переменные начинают существовать при достижении вычислений в блоке точки объявления и перестают существовать, когда процесс вычисления завершает выполнение операторов блока. Можно полагать, что для каждого такого блока выполняется так называемый пролог и эпилог. В прологе локальным переменным отводится память, в эпилоге память освобождается. Фактически ситуация сложнее, поскольку выделение памяти, а следовательно, и начало жизни переменной, объявленной в блоке, происходит не в момент входа в блок, а лишь тогда, когда достигается точка объявления локальной переменной. В C# разрешено иметь локальные переменные с именами, совпадающими с именами полей класса, однако, запрещено иметь локальные переменные, имена которых совпадают с именами формальных аргументов. Этот запрет распространяется не только на внешний уровень процедурного блока, но и на все внутренние блоки.

Глоб.переменные на уровне модуля. Во многих языках программирования переменные могут объявляться на уровне модуля. Такие переменные называются глобальными. Их область действия распространяется, по крайней мере, на весь модуль. Глобальные переменные играют важную роль, поскольку они обеспечивают весьма эффективный способ обмена информацией между различными частями модуля. Обратная сторона эффективности аппарата глобальных переменных, - их опасность. Если какая-либо задача (процедура), в которой доступна глобальная переменная, некорректно изменит ее значение, то ошибка может проявиться в другой задаче, использующей эту переменную. Найти причину ошибки очень трудно, и придется ее искать во всех задачах(процедурах). В C# роль модуля играют классы, пространства имен, проекты, решения. Поля классов, могут рассматриваться как глобальные переменные класса. Но здесь у них особая роль: данные (поля) являются тем центром, вокруг которого вращается мир класса. Каждый экземпляр класса - это отдельный мир. Поля экземпляра (открытые и закрытые) – это глобальная информация, которая доступна всем методам класса, играющим второстепенную роль – они обрабатывают данные. Статические поля класса хранят информацию, общую для всех экземпляров класса. Они представляют определенную опасность, поскольку каждый экземпляр способен менять их значения. В других видах модуля - пространствах имен, проектах, решениях - нельзя объявлять переменные. В пространствах имен в языке C# разрешено только объявление классов и их частных случаев: структур, интерфейсов, делегатов, перечислений. Поэтому глобальных переменных уровня модуля, в привычном для других языков программирования смысле, в языке C# нет. Классы не могут обмениваться информацией, используя глобальные переменные. Все взаимодействие между ними обеспечивается способами, стандартными для объектного подхода. Между классами могут существовать два типа отношений - клиентские и наследования, а основной способ инициации вычислений - это вызов метода для объекта-цели или вызов обработчика события. Поля класса и аргументы метода позволяют передавать и получать нужную информацию. Устранение глобальных переменных как источника опасных, трудно находимых ошибок существенно повышает надежность создаваемых на C# программных продуктов.

Глоб.переменные на уровне процедуры. Переменная, объявленная во внешнем блоке, рассматривается как глобальная по отношению к внутренним блокам. Во всех языках программирования во внутренних блоках разрешается объявлять переменные с именем, совпадающим с именем глобальной переменной. Конфликт имен снимается за счет того, что локальное внутреннее определение сильнее внешнего. Поэтому область видимости внешней глобальной переменной сужается и не распространяется на те внутренние блоки, где объявлена переменная с подобным именем. Внутри блока действует локальное объявление этого блока, при выходе восстанавливается область действия внешнего имени. В языке C# этот гордиев узел конфликтующих имен разрублен, - во внутренних блоках запрещено использование имен, совпадающих с именем, использованным во внешнем блоке. Глоб.переменные на уровне процедуры в языке C#, конечно же, есть, но нет конфликта имен между глобальными и локальными переменными на этом уровне. Область видимости глобальных переменных процедурного блока распространяется на весь блок, в котором они объявлены, начиная от точки объявления, и не зависит от существования внутренних блоков. Когда говорят, что в C# нет глобальных переменных, то, прежде всего, имеют в виду их отсутствие на уровне модуля. Уже во вторую очередь речь идет об отсутствии конфликтов имен на процедурном уровне.

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

- приоритет операций;

- для операций одного приоритетапорядок применения- слева направо или справа налево;

- преобразование типов операндов и выбор реализации для перегруженных операций;

тип и значение результата выполнения операции над заданными значениями операндов определенного типа;

- типы и значение результата выполнения операции для заданных значений операндов определенного типа.

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

Вычисление выражения начинается с выполнения операций высшего приоритета. Первым делом вычисляются выражения в круглых скобках - (expr), определяются значения полей объекта - x.y, вычисляются функции - f(x), переменные с индексами - a[i]. Выполнение этих операций достаточно понятно и не нуждается в комментировании. Операции checked и unchecked включают и выключают проверку преобразований арифметического типа в выражениях, которым они предшествуют.

Вопрос13.Операции и их приоритеты. Большинство операций в языке C#, их приоритет и порядок наследованы из языка C++. Однако имеются и различия: например, нет операции ", ", позволяющей вычислять список выражений; добавлены уже упоминавшиеся операции checked и unchecked, применимые к выражениям.

Приоритет-Категория-Операции-Порядок

0-Первичные-(expr) x.y f(x) a[x], x++, x--, new,sizeof(t),typeof(t), checked(expr), unchecked(expr)-Слева направо

1-Унарные- +, -,!, ~, ++x, --x, (T)x-Слева направо

2-Мультипликативные(Умножение)- *, /, %-Слева направо

3-Аддитивные(Сложение)- +, - Слева направо

4-Сдвиг- <<, >>-Слева направо

5-Отношения,проверка типов- <, >, <=, >=, is as –Слева направо

6-Эквивалентность- ==,!= Слева направо

7-Логическое- И, & -Слева направо

8-Логическое исключающее ИЛИ(XOR)- ^ Слева направо

9-Логическое ИЛИ (OR)- | Слева направо

10-Условное- И, && - Слева направо

11-Условное ИЛИ- || -Слева направо

12-Условное выражение-?: Справа налево

13-Присваивание =, *=, /=, %=, +=, -=, <<=, >>=, &=, ^=, |= Справа налево

 

Вопрос14.Перегрузка операторов. Под перегрузкой операциипонимается существование нескольких реализаций одной и той же операции. Большинство операций языка C# перегружены - одна и та же операция может применяться к операндам различных типов. Поэтому перед выполнением операции идет поиск реализации, подходящей для данных типов операндов. Замечу, что операции, как правило, выполняются над операндами одного типа. Если же операнды разных типов, то предварительно происходит неявное преобразование типа операнда. Оба операнда могут быть одного типа, но преобразование типов может все равно происходить - по той причине, что для заданных типов нет соответствующей перегруженной операции. Такая ситуация достаточно часто возникает на практике, поскольку, например, операция сложения не определена для младших подтипов арифметического типа. Например, операция сложения не определена для младших подтипов арифметического типа.

 

 

Вопрос№15.Операторы языка C#.Оператор присваивания. Как в языке С++, так и в C# присваивание формально считается операцией. Вместе с тем запись: X = expr;

следует считать настоящим оператором присваивания, так же, как и одновременное присваивание со списком переменных в левой части:

X1 = X2 =... = Xk = expr;

В отличие от языка C++ появление присваивания в выражениях C# хотя и допустимо, но практически не встречается. Например, запись: if(x = expr)... часто используемая в С++, в языке C# в большинстве случаев будет воспринята как ошибка еще на этапе компиляции. В предыдущих лекциях семантика присваивания разбиралась достаточно подробно, поэтому сейчас я на этом останавливаться не буду.

Вопрос№16.Блок или составной оператор. Пустой оператор. С помощью фигурных скобок несколько операторов языка (возможно, перемежаемых объявлениями) можно объединить в единую синтаксическую конструкцию, называемую блоком или составным оператором:

{

оператор_1

...

оператор_N

}

В приведенной выше записи блока, следуя синтаксису C#, каждый из операторов заканчивается символом ";". Но блок не заканчивается этим символом!

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

Пустой оператор- это "пусто", завершаемое точкой с запятой. Иногда полезно рассматривать отсутствие операторов как существующий пустой оператор. синтаксически допустимо ставить лишние точки с запятой, полагая, что вставляются пустые операторы. Например, синтаксически допустима следующая конструкция:

for (int j=1; j<5; j++)

{;;;};

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



Поделиться:


Последнее изменение этой страницы: 2017-02-07; просмотров: 237; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.144.48.135 (0.017 с.)