
- •Глава 10, описывающая классы как контейнеры их статических членов,
- •Глава 13 посвящена отношениям между классами (и их объектами). Особое
- •Глава 18 включена в книгу при подготовке второго издания. Она посвящен
- •Глава 1. Объектная ориентация программ
- •1.1. Типы, классы, объекты
- •1.2. Программа на c#
- •1.3. Пространство имен
- •1.4. Создание консольного приложения
- •Глава 2. Типы в языке c#
- •2.1. Типы ссылок и типы значений
- •2.2. Классификация типов c#
- •2.3. Простые типы. Константы-литерал
- •2.4. Объявления переменных и констант базовых типо
- •If implicit in int interface
- •Internal is lock long namespace
- •Volatile while
- •Глава 3. Операции и целочисленные выражения
- •3.1. Операции языка c#
- •3.2. Операции присваивания и оператор
- •3.4. Выражения с арифметическими операциями
- •3.6. Переполнения при операциях с целыми
- •Глава 4. Выражения с операндами базовых
- •4.1. Автоматическое и явное приведение арифметических типов
- •4.2. Особые ситуации в арифметических выражениях
- •4.3. Логический тип и логические выражения
- •4.4. Выражения с символьными операндами
- •4.5. Тернарная (условная) операция
- •Глава 5. Типы с# как классы платформы .Net
- •5.1. Платформа .Net Framework и спецификация cts
- •5.2. Простые (базовые) типы c# как классы
- •5.3. Специфические методы и поля простых типов
- •Глава 6. Операторы
- •6.1. Общие сведения об операторах
- •6.2. Метки и оператор безусловного перехода
- •6.3. Условный оператор (ветвлений)
- •If (логическое выражение) оператор_1
- •6.4. Операторы цикла
- •6.5. Операторы передачи управления
- •If (условие) break;
- •6.6. Переключатель
- •Int ball; // оценка в баллах:
- •Глава 7. Массивы
- •7.1. Одномерные массивы
- •Int [ ] integers
- •Int number;
- •7.2. Массивы как наследники класса Array
- •7.3. Виды массивов и массивы многомерные
- •Int [,] dots;
- •Int size;
- •7.4. Массивы массивов и непрямоугольные массивы
- •Int size;
- •7.5. Массивы массивов и поверхностное копирование
- •Int size;
- •Int size;
- •Глава 8. Строки – объекты класса string
- •8.1. Строковые литералы
- •8.2. Строковые объекты и ссылки типа string
- •242.ToString()
- •8.3. Операции над строками
- •8.4. Некоторые методы и свойства класса String
- •8.5. Форматирование строк
- •8.6. Строка как контейне
- •8.7. Применение строк в переключателях
- •8.8. Массивы строк
- •8.8. Сравнение строк
- •Int static Compare (string, string)
- •Int static Compare (string, string, Boolean,CultureInfo)
- •If (string.Compare(res, hen, true,
- •8.9. Преобразования с участием строкового типа
- •38 Попугаев.
- •8.10. Аргументы метода Main( )
- •8.11. Неизменяемость объектов класса String
- •Глава 9. Методы c#
- •9.1. Методы–процедуры и методы-функции
- •9.2. Соотношение фиксированных параметров и аргументов
- •Int iPart;
- •9.3. Параметры с типами ссылок
- •Int[ ] temp;
- •Int[ ] temp;
- •9.4. Методы с переменным числом аргументов
- •VarParams(a, b, c);
- •9.5. Перегрузка методов
- •9.6. Рекурсивные методы
- •4*Fact (3); {
- •9.7. Применение метода Array.Sort()
- •Int имя_функции(тип параметр_1, тип параметр_2)
- •If(условие 2) return -1; // порядок соблюдён
- •Глава 10. Класс как совокупность статических
- •10.1. Статические члены класса
- •10.2. Поля классов (статические поля)
- •Int X; // поле объектов класса
- •10.3. Статические константы
- •10.4. Статические методы
- •10.5. Статический конструктор
- •10.6. Статические классы
- •Глава 11. Классы как типы
- •11.1. Объявление класса
- •11.2. Поля объектов
- •11.3. Объявления методов объектов
- •11.4. Пример класса и его объектов
- •Int count; // текущее показание
- •1 ' Counter.Count' is inaccessible due to its protection leve
- •11.5. Ссылка this
- •Int numb;
- •11.6. Конструкторы объектов класса
- •Int p; // порядок - инициализация по умолчанию
- •Void reduce() // Приведение числа к каноническому виду.
- •11.7. Деструкторы и финализаторы
- •Глава 12. Средства взаимодействия с объектами
- •12.1. Принцип инкапсуляции и методы объектов
- •12.2. Свойства классов
- •Internal, private, static, virtual, sealed, override, abstract, extern
- •Internal protected
- •Int p; // инициализация по умолчанию
- •Void reduce() // "Внутренний" для класса метод
- •12.3. Автореализуемые свойств
- •12.4. Индексаторы
- •Int[] days; // часы по дням недели
- •Int search(string str) { // поиск слова
- •12.5. Индексаторы, имитирующие наличие контейнера
- •Глава 13. Включение, вложение и наследование
- •13.1. Включение объектов классов
- •13.2. Вложение классов
- •13.3. Наследование классов
- •13.4. Доступность членов класса при наследовании
- •13.5. Методы при наследовании
- •13.6. Абстрактные методы и абстрактные классы
- •13.7. Опечатанные классы и методы
- •13.8. Применение абстрактых классов
- •Глава 14. Интерфейсы
- •14.1. Два вида наследования в ооп
- •14.2. Объявления интерфейсов
- •Interface имя_интерфейса
- •Interface iPublication { // интерфейс публикаций
- •Void write(); // готовить публикацию
- •Void read(); // читать публикацию
- •14.3. Реализация интерфейсов
- •Interface iPublication { // интерфейс публикаций
- •Void write(); // готовить публикацию
- •Void read(); // читать публикацию
- •Interface iSeries {
- •Void setBegin(); // восстановить начальное состояние
- •Int GetNext { get; } // вернуть очередной член ряда
- •Int this[int k] {get;} // вернуть к-й член ряда
- •Interface iSeries // интерфейс числовых рядов
- •14.4. Интерфейс как ти
- •Interface iGeo { // интерфейс геометрической фигуры
- •Void transform(double coef); // преобразовать размеры
- •Void display(); // вывести характеристики
- •Interface iGeo {
- •Void transform(double coef); // преобразовать размеры
- •Void display(); // вывести характеристики
- •Ira.Transform(3);
- •Ira.Transform(3);
- •14.5. Интерфейсы и наследование
- •Interface iPublication // интерфейс публикаций
- •Interface iBase
- •Interface iBase {
- •Глава 15. Перечисления и структуры
- •15.1. Перечисления
- •15.2. Базовый класс перечислений
- •IsDe fined"
- •15.3. Структуры
- •15.4. Упаковка и распаковка
- •If (obj is Struct1)
- •If (ob is PointS)
- •If (ob is Double)
- •15.5. Реализация структурами интерфейсов
- •Interface iShape {
- •Interface iShape
- •Information(ci);
- •Information(sp);
- •Interface iImage {
- •Void display();
- •Interface iImage
- •Void display();
- •Глава 16. Исключения
- •16.1. О механизме исключений
- •16.3. Свойства исключений
- •16.4. Управление программой с помощью исключений
- •X; // Вводимое число.
- •16.5. Исключения в арифметических выражениях
- •16.6. Генерация исключений
- •If (!double.TryParse(input, out u))
- •If (!double.TryParse(input, out u)
- •16.7. Пользовательские классы исключений
- •Глава 17. Делегаты и события
- •17.1. Синтаксис делегатов
- •17.2. Массивы делегатов
- •Int X, y; // положение робота на плоскости
- •17.3. Многоадресные (групповые) экземпляры делегатов
- •Virtual
- •17.4. Делегаты и обратные вызовы
- •17.5. Анонимные методы
- •17.6. События
- •Int size; // размер массива
- •Int[ ] ar; // ссылка на массив
- •Int temp;
- •Глава 18. Обобщения
- •18.1. Обобщения как средство абстракции
- •18.2. Декларации обобщённых классов "декларация
- •18.3. Ограничения типизирующих параметров
- •Intemface iComparable {
- •Int CompareTo (object p);
- •18.4. Обобщённые структуры "обобщённые структуры"
- •18.5. Обобщённые интерфейсы "обобщённый интерфейс"
- •Int add(t X, t y); // прототип метода
- •18.6. Обобщённые методы "обобщённые методы"
- •18.7. Обобщённые делегаты "обобщённые делегаты"
- •Virtual
- •InnerException
- •Interface
Глава 9. Методы c#
9.1. Методы–процедуры и методы-функции
Как писал Никлаус Вирт, программы — это алгоритмы + структуры данных.
Можно считать, что данные в C# – это поля объектов и статические поля классов.
Алгоритмы (то есть функциональность программ) представляются с помощью
методов класса и методов его объектов. В языке C# методы не существуют вне
классов. Нестатические методы – реализуют функциональность объектов.
Статические методы обеспечивают функциональность классов и, тем самым,
программы в целом.
Для определения методов и при их вызове в C# не используются никакие
служебные слова. В "языках древности", таких как ФОРТРАН или КОБОЛ, и в
некоторых более современных языках, не входящих в семейство Си-образных, для
обозначения подпрограмм, функций, процедур используются специальные термины,
включаемые в список служебных слов соответствующего языка. (FUNCTION,
SUBROUTINE – в Фортране, procedure в Паскале и т.д.). Для вызова подпрограмм в
Фортране используется конструкция со служебным словом CALL и т.п.
В языках, ведущих своё происхождение от языка Си (С++, Java, C# и др.) при
определении функций и для обращения к ним специальные термины не
применяются. Это в полной мере относится и к методам языка C#. Однако
синтаксически и семантически методы C# можно разделить на процедуры
"процедуры" и функции "функции" . Это деление не особенно жёсткое и в ряде
случаев метод может играть две роли – и процедуры и функции.
В упрощённом варианте формат декларации метода, который может играть
роль как процедуры, так и функции, можно представить так:
модификаторы_методаopt
тип_возвращаемого_значения имя_метода (спецификация_параметров)
{ операторы_тела_метода }
Индекс opt указывает на необязательность модификаторов метода.
Фигурные скобки ограничивают тело метода
"метод:тело метода" , часть
объявления перед телом метода называют заголовком метода
"метод:заголовок
метода" .
Минимальная конструкция, применяемая для обращения к методу:
имя_метода(список_аргументов).
В общем случае имя метода при обращении дополняется префиксами,
указывающими на принадлежность метода пространству имён, конкретному классу
или реально существующему объекту.
Метод–процедура "метод:метод–процедура" отличается от метода–функции
следующими свойствами:
В качестве типа возвращаемого значения используется void, т.е. процедура не
возвращает в точку вызова никакого результата.
В теле процедуры может отсутствовать оператор возврата return, а когда он
присутствует, то
в нём нет выражения для вычисления возвращаемого
значения. Если оператор return отсутствует, то точка выхода из процедуры
(из метода) расположена за последним оператором тела метода.
Для обращения к методу-процедуре используется только оператор вызова
метода:
имя_метода (список_аргументов);
Метод–функция "метод:метод–функция" :
В качестве типа возвращаемого значения используется тип ссылки или тип
значения. Таким образом, функция всегда возвращает в точку вызова результат.
В теле функции всегда присутствует, по крайней мере, один оператор возврата:
return выражение;
Выражение определяет возвращаемый функцией результат.
Обращение к методу-функции может использоваться в качестве операнда
подходящего выражения. Термин "подходящего" относится к необходимост
и
согласования операндов в выражении по типам.
Если результат, возвращаемый методом-функцией, по каким-то причинам не
нужен в программе, а требуется только выполнение операторов тела функции, то
обращение к ней может оформляться как отдельный оператор:
имя_метода (список_аргументов);
В этом случае функция выступает в роли процедуры.
Когда вы знакомитесь с некоторым методом (или пишете свой метод), очень
важно понимать, откуда метод берёт (или будет брать) исходные данные и куда (и
как) метод отправляет результаты своей работы.
Исходные данные могут быть получены:
Через аппарат параметров метода;
Как глобальные по отношению к методу;
От внешних устройств (потоки ввода, файловые потоки).
Результаты метод может передавать:
В точку вызова как возвращаемое значение;
В глобальные по отношению к методу объекты;
Внешним устройствам (потоки вывода, файловые потоки);
Через аппарат параметров метода.
Глобальными по отношению к методу объектами в C# являются статические
поля класса, в котором, метод определён, и поля (статические) других классов,
непосредственный доступ к которым имеет метод. Обмены через глобальные
объекты являются нарушением принципов инкапсуляции и обычно в реальных
разработках запрещены или не рекомендуются.
Обмены со стандартными потоками ввода-вывода, поддерживаемые средствами
класса Console, нам уже знакомы. Для организации обменов с файловыми потоками
используются те средства библиотеки классов, которые мы ещё не рассматривали.
Сосредоточимся на особенностях обменов через аппарат параметров.
При определении метода в его заголовке размещается спецификация
параметров
"параметр:спецификация параметров"
(возможно пустая) –
разделённая запятыми последовательность спецификаторов параметров. Каждый
спецификатор имеет вид:
модификатор тип_параметра имя_параметра
Модификатор параметра может отсутствовать или имеет одну из следующих
форм: ref, out, params.
Ограничений на тип параметра не накладывается. Параметр может быть
предопределённого
типа
(базовые
типы,
строки,
object);
перечислением;
структурой; классом; массивом; интерфейсом; делегатом.
Имя параметра — это идентификатор, который выбирает программист –
автор
метода.
Область
видимости
и
время
существования
параметра
ограничиваются заголовком и телом метода. Таким образом, параметры не видны и
недоступны для кода, который не размещён в теле метода.
Стандарт
C#
отмечает
существование
четырёх
видов
параметров
"параметр:вид параметра" :
параметры, передаваемые по значениям
значениям" ;
параметры, передаваемые по ссылкам
"параметр:параметры, передаваемые по
"параметр:параметр передаваемый по
ссылкам" (ref);
выходные параметры "параметр:выходные параметры" (out);
массив-параметр "параметр:массив-параметр" (params).
Параметры первых трёх видов в Стандарте C# называют фиксированными
параметрами. Спецификация фиксированного параметра включает необязательный
модификатор ref или out, обозначение типа и идентификатор (имя параметра).
Список параметров представляет собой, возможно пустую, последовательност
ь
разделённых запятыми спецификаторов параметров, из которых только последний
может быть массивом-параметром, имеющим модификатор params.
Модификаторы метода "метод:модификаторы метода" необязательны, но их
достаточно много. Вот их список, пока без комментариев:
new, public, protected, internal, private, static, virtual, sealed, override,
abstract, extern.
В данной главе мы будем рассматривать только методы классов (не объектов).
В декларацию каждого метода класса входит модификатор static и такой метод
называют статическим методом класса "метод:статический метод класса" .
Чтобы продемонстрировать некоторые возможности и отличия метода-
процедуры от метода-функции, рассмотрим следующую программу
// 09_01.cs - Статические методы – процедура и функция
using System;
class Program
{
static void print(string line)
{
Console.WriteLine("Длина строки: " + line.Length);
Console.WriteLine("Значение строки: " + line);
}
static string change(string str)
{
char[] rev = str.ToCharArray();
Array.Reverse(rev);
return new string(rev);
}
static void Main()
{
string numbers = "123456789";
print(numbers);
numbers = change(numbers);
print(numbers);
}
}
Результат выполнения программы:
Длина строки: 9
Значение строки: 123456789
Длина строки: 9
Значение строки: 987654321
В классе Program три статических метода. Метод print( ) получает исходные
данные в виде строки-параметра и выводит длину и значение этой строки. В точку
вызова метод print( ) ничего не возвращает – это процедура.
Метод change() – это функция. Он получает в качестве параметра строку,
формирует её перевёрнутое значение и возвращает в точку вызова этот результат.
В функции Main( ) определена ссылка numbers на строку "123456789". В
отдельном операторе вызван метод-процедура print(numbers), который выводит
сведения о строке, именованной ссылкой numbers. Затем та же ссылка
использована в качестве аргумента метода-функции change(). Обращение к этому
методу размещено в правой части оператора присваивания, поэтому возвращаемый
методом change() результат становится новым значением ссылки numbers.
Повторное обращение к методу print() иллюстрирует изменения.