Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lekcia5.doc
Скачиваний:
11
Добавлен:
20.03.2016
Размер:
339.97 Кб
Скачать

10

ЛЕКЦИЯ 5. Подпрограммы пользователя

Учебные вопросы:

1. Типы ссылки и типы значения. 1

2. Подпрограммы 3

3. Рекурсия 9

4. Перегрузка методов 10

1. Типы ссылки и типы значения.

Система типов языка C# включает несколько категорий типов:

  • типы значений (типы-значения = размерные типы),

  • ссылочные типы (типы-ссылки),

  • параметризованные типы (типы-шаблоны)

Схема типов представлена ниже.

Простые (элементарные) типы – это типы, имя и основные свойства которых известны компилятору. Относительно элементарных типов компилятору не требуется никакой допол­нительной информации. Свойства и функциональность этих типов известны. К простым типам от­носятся: целочис­лен­ные, с плава­­ющей точкой, decimal, булевский.

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

Область видимости и время существования переменных

В С# разрешается объявлять переменные внутри любого блока. Блок начинается открывающей, а завершается закрывающей фигурными скобками. Любой блок определяет область объявления, или область видимости объектов. Таким образом, при создании блока создается и новая область видимости, которая определяет, какие объекты видимы для других частей программы. Область видимости также определяет время существования этих объектов.

Самыми важными в С# являются области видимости, которые определены классом и методом.

Область видимости, определяемая методом, начинается с открывающей фигурной скобки. Но если метод имеет параметры, они также относятся к области видимости метода.

Как правило, переменные, объявленные в некоторой области видимости, невидимы (т.е. недоступны) для кода, который определяется вне этой области видимости. Таким образом, при объявлении переменной внутри области видимости вы локализируете ее и защищаете от неправомочного доступа и/или модификации.

Области видимости могут быть вложенными. Например, при каждом создании программного блока создается новая вложенная область видимости. В этом случае внешняя область включает внутреннюю. Это означает, что объекты, объявленные внутри внешней области, будут видимы для кода внутренней области. Но обратное утверждение неверно: объекты, объявленные во внутренней области, невидимы вне ее.

Конфликта имен (проблемы с обращением к одноименным объектам) позволяет избежать принятая в языке дисциплина именования. Избежать конфликта имен в C# позволяет такая синтаксическая конструкция, как блок операторов.

Блок – это множество предложений (возможно пустое), заключенное в фигурные скобки.

Различается несколько категорий блоков:

Тело класса (структуры). Место объявления членов класса.

Тело метода. Место расположения операторов метода.

Блок в теле метода.

Переменные можно объявлять в любом месте блока. Точка объявления переменной в буквальном смысле соответствует месту ее создания. Обращение к объявляемой сущности (переменной или константе) "выше" точки ее объявления лишено смысла.

Новый блок – новая область видимости. Объекты, объявляемые во внутренних блоках, не видны во внешних блоках. Объекты, объявленные в методе и во внешних блоках, видны и во внутренних блоках. Одноименные объекты во вложенных областях конфликтуют.

Объекты, объявляемые в блоках одного уровня вложенности в методе, не видны друг для друга. Конфликта имен не происходит.

В теле класса не допускается объявления одноименных данных-членов. Нарушение этого правила приводит к неоднозначности. В теле класса не допускается объявления одноименных функций – членов (методов класса) с пустыми списками параметров. Также не допускаются объявления одноименных функций – членов (методов класса) со списками параметров, у которых совпадают типы параметров. В списках параметров имена параметров не важны. Важно, что выражение вызова метода в этом случае будет неоднозначным.

Имена данных – членов класса не конфликтуют с одноименными переменными, объявляемыми в теле методов, поскольку в теле метода обращение к членам класса обеспечивается выражениями с операцией доступа, и никакого конфликта в принципе быть не может.

this в конструкторе, деструкторе, методе, свойстве

Нестатический метод класса определяет индивидуальное поведение объекта и поэтому вызывается "от имени" данного объекта. В большинстве объектно-ориентированных языков программирования реализована возможность непосредственного обращения из нестатического метода (а также свойства) к объекту, который обеспечил выполнение кода данного метода или свойства. Аналогичная возможность обращения к объекту реализуется в теле нестатических конструкторов и деструктора.

В C# связь метода (свойства, конструктора, деструктора) с объектом обеспечивается первичным выражением (элементарным выражением языка) this. Это выражение не требует никакого дополнительного объявления, его тип соответствует классу, содержащему объявление данного метода. Он может использоваться в теле любого нестатического метода, конструктора и деструктора в любом классе или структуре, если только они содержат соответствующие объявления.

По своей сути первичное выражение this в данном контексте является ссылкой на объект, обеспечивающий выполнение данного кода.

Если метод возвращает ссылку на объект, который вызвал данный метод, this можно использовать в качестве возвращаемого значения оператора return.

Пример работы с локальной и глобальной переменными.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]