ЛЕКЦИЯ 5. Подпрограммы пользователя
Учебные вопросы:
1. Типы ссылки и типы значения. 1
2. Подпрограммы 3
3. Рекурсия 9
4. Перегрузка методов 10
1. Типы ссылки и типы значения.
Система типов языка C# включает несколько категорий типов:
-
типы значений (типы-значения = размерные типы),
-
ссылочные типы (типы-ссылки),
-
параметризованные типы (типы-шаблоны)
Схема типов представлена ниже.
Простые (элементарные) типы – это типы, имя и основные свойства которых известны компилятору. Относительно элементарных типов компилятору не требуется никакой дополнительной информации. Свойства и функциональность этих типов известны. К простым типам относятся: целочисленные, с плавающей точкой, decimal, булевский.
Выполнение оператора объявления переменной типа-значения в методе класса приводит к созданию в памяти объекта соответствующего типа, возможно, проинициализированного определенным значением. Это значение может быть задано в виде литерала соответствующего типа или в виде выражения.
Область видимости и время существования переменных
В С# разрешается объявлять переменные внутри любого блока. Блок начинается открывающей, а завершается закрывающей фигурными скобками. Любой блок определяет область объявления, или область видимости объектов. Таким образом, при создании блока создается и новая область видимости, которая определяет, какие объекты видимы для других частей программы. Область видимости также определяет время существования этих объектов.
Самыми важными в С# являются области видимости, которые определены классом и методом.
Область видимости, определяемая методом, начинается с открывающей фигурной скобки. Но если метод имеет параметры, они также относятся к области видимости метода.
Как правило, переменные, объявленные в некоторой области видимости, невидимы (т.е. недоступны) для кода, который определяется вне этой области видимости. Таким образом, при объявлении переменной внутри области видимости вы локализируете ее и защищаете от неправомочного доступа и/или модификации.
Области видимости могут быть вложенными. Например, при каждом создании программного блока создается новая вложенная область видимости. В этом случае внешняя область включает внутреннюю. Это означает, что объекты, объявленные внутри внешней области, будут видимы для кода внутренней области. Но обратное утверждение неверно: объекты, объявленные во внутренней области, невидимы вне ее.
Конфликта имен (проблемы с обращением к одноименным объектам) позволяет избежать принятая в языке дисциплина именования. Избежать конфликта имен в C# позволяет такая синтаксическая конструкция, как блок операторов.
Блок – это множество предложений (возможно пустое), заключенное в фигурные скобки.
Различается несколько категорий блоков:
Тело класса (структуры). Место объявления членов класса.
Тело метода. Место расположения операторов метода.
Блок в теле метода.
Переменные можно объявлять в любом месте блока. Точка объявления переменной в буквальном смысле соответствует месту ее создания. Обращение к объявляемой сущности (переменной или константе) "выше" точки ее объявления лишено смысла.
Новый блок – новая область видимости. Объекты, объявляемые во внутренних блоках, не видны во внешних блоках. Объекты, объявленные в методе и во внешних блоках, видны и во внутренних блоках. Одноименные объекты во вложенных областях конфликтуют.
Объекты, объявляемые в блоках одного уровня вложенности в методе, не видны друг для друга. Конфликта имен не происходит.
В теле класса не допускается объявления одноименных данных-членов. Нарушение этого правила приводит к неоднозначности. В теле класса не допускается объявления одноименных функций – членов (методов класса) с пустыми списками параметров. Также не допускаются объявления одноименных функций – членов (методов класса) со списками параметров, у которых совпадают типы параметров. В списках параметров имена параметров не важны. Важно, что выражение вызова метода в этом случае будет неоднозначным.
Имена данных – членов класса не конфликтуют с одноименными переменными, объявляемыми в теле методов, поскольку в теле метода обращение к членам класса обеспечивается выражениями с операцией доступа, и никакого конфликта в принципе быть не может.
this в конструкторе, деструкторе, методе, свойстве
Нестатический метод класса определяет индивидуальное поведение объекта и поэтому вызывается "от имени" данного объекта. В большинстве объектно-ориентированных языков программирования реализована возможность непосредственного обращения из нестатического метода (а также свойства) к объекту, который обеспечил выполнение кода данного метода или свойства. Аналогичная возможность обращения к объекту реализуется в теле нестатических конструкторов и деструктора.
В C# связь метода (свойства, конструктора, деструктора) с объектом обеспечивается первичным выражением (элементарным выражением языка) this. Это выражение не требует никакого дополнительного объявления, его тип соответствует классу, содержащему объявление данного метода. Он может использоваться в теле любого нестатического метода, конструктора и деструктора в любом классе или структуре, если только они содержат соответствующие объявления.
По своей сути первичное выражение this в данном контексте является ссылкой на объект, обеспечивающий выполнение данного кода.
Если метод возвращает ссылку на объект, который вызвал данный метод, this можно использовать в качестве возвращаемого значения оператора return.
Пример работы с локальной и глобальной переменными.