Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Программирование. Введение в разработку на C#. Учебное пособие
.pdf
Console.WriteLine("В нижнем регистре");
if (Char.IsUpper(ch))
Console.WriteLine("В верхнем регистре");
if (Char.IsWhiteSpace(ch))
Console.WriteLine("Пробел");
if (Char.IsPunctuation(ch))
Console.WriteLine("Знак пунктуации");
В примере используется метод isDigit структуры Char для определения, является ли ch цифрой. Если да, то метод возвращает true; в противном случае метод возвращает false. Метод IsLetter структуры Char
используется для определения, является ли inputCharacter буквой, метод IsLetterOrDigit – для определения, является ch буквой или цифрой,
метод isLower – для определения, набрано ли ch строчными буквами, а
метод IsUpper – прописными буквами. Метод isPunctuation структуры
Char применяется для определения, является ли ch знаком пунктуации,
а IsWhiteSpace пробелом. Результат работы программы – вывод на экран
всех выполняемых условий.
6.5. Вопросы для самопроверки
1. Приведите 5-7 методов класса string, объясните их значение.
2. В какой кодировке хранятся строки внутри объектов класса
string?
3. Для каких целей служит класс StringBuilder?
4. Эквивалентны ли результаты, возвращаемые при выполнении
приведённых ниже примеров сравнения строк?
A == B
B == A
A.equals(B)
B.equals(A)
61

5. В чём отличия == и equals? Какой подход, на ваш взгляд, более
предпочтителен?
6. Начиная с какого числа операций добавления строк применение
класса StringBuilder себя оправдывает?
7. Как определить, когда использовать String, а когда Char?
6.6. Задания для самопроверки
1. Напишите консольное приложение, которое считывает введённую
пользователем строку и возвращает её инвертированное значение.
2. Напишите консольное приложение, которое последовательно
считывает 2 строки, введённые пользователем, сравнивает их и выводит
результат сравнения.
3. Напишите приложение, которое может выполнить сравнение
производительности конкатенации строк обычным методом и
StringBuilder для числа подстрок от 1 до 10 000.
4. Напишите приложение для создания массива символов и записи в
него строки, после чего переставьте элементы массива в обратном порядке и создайте новую строку, используя символы массива.
5. Напишите приложение для получения подстрок и для перевода
всех символов в верхний и нижний регистры.
62

7. ПОЛЬЗОВАТЕЛЬСКИЕ ТИПЫ
7.1. Сложный пользовательский тип class
Класс – это такая абстракция множества предметов реального мира,
что:
1) предметы в этом множестве – объекты – имеют одни и те же
характеристики;
2) все объекты подчинены и согласованы с одним и тем же
набором правил и линий поведений.
В объектно-ориентированной программе с применением классов каждый объект является «экземпляром» некоторого конкретного класса. То
есть «экземпляр класса» в данном случае обозначает не «пример некоторого класса» или «отдельно взятый класс», а «объект, типом которого является какой-то класс». При этом в разных языках программирования допускается либо не допускается существование еще каких-то типов данных, экземпляры которых не являются объектами (то есть язык определяет, являются ли объектами такие вещи, как числа, массивы и указатели,
или не являются, и, соответственно, есть ли такие классы как «число»,
«массив» или «указатель», экземплярами которых были бы каждое конкретное число, массив или указатель).
Например, абстрактный тип данных «строчка текстового
сообщения» может быть оформлен в виде класса, и тогда все строки
текста в программе будут являться объектами – экземплярами класса
«строчка текстового сообщения».
Классы могут задавать поля – то есть переменные, принадлежащие
либо непосредственно самому классу (статические), либо экземплярам
класса (обычные). Статические поля существуют в одном экземпляре на
всю программу (или, в более сложном варианте, – в одном экземпляре
на процесс или на поток/нить). Обычные поля создаются по одной
копии для каждого конкретного объекта – экземпляра класса. Например,
общее количество строк текста, созданных в программе за время её
работы, будет являться статическим полем класса «строка текста». А
63

конкретный массив символов строки будет являться обычным полем
экземпляра класса «строка текста», так же как переменная «фамилия»,
имеющая тип «строка текста», будет являться обычным полем каждого
конкретного экземпляра класса «человек».
В ООП (объектно-ориентированном программировании) при
использовании классов весь исполняемый код программы (алгоритмы)
будет оформлен в виде так называемых «методов», «функций» или
«процедур», что соответствует обычному структурному
программированию, однако теперь они могут (а во многих языках
обязаны) принадлежать тому или иному классу. Например, по
возможности, класс «строка текста» будет содержать все основные
методы/функции/процедуры, предназначенные для работы со строкой
текста, такие как поиск в строке, вырезание части строки и т. д.
Как и поля, код в виде методов/функций/процедур, принадлежащих
классу, может быть отнесен либо к самому классу, либо к экземплярам
класса. Метод, принадлежащий классу и соотнесенный с классом
(статический метод) может быть вызван сам по себе и имеет доступ к
статическим переменным класса. Метод, соотнесенный с экземпляром
класса (обычный метод), может быть вызван только у самого объекта и
имеет доступ как к статическим полям класса, так и к обычным полям
конкретного объекта (при вызове этот объект передастся скрытым
параметром метода). Например, общее количество созданных строк
можно узнать из любого места программы, но длину конкретной строки
можно узнать только указав тем или иным образом, длину какой строки
нужно измерить.
Сам класс не является объектом, однако в зависимости от языка
программирования и платформы программисту могут быть доступны те
или иные объекты, позволяющие получить информацию о классе –
название, список членов, объем памяти, занимаемой классом или
отдельным экземпляром. Например, может существовать специальный
класс «тип данных», экземпляры которого описывают тот или иной
конкретный класс, существующий в программе.
64

7.2. Создание и использование классов
Для определений множественных классов в одном проекте требуется их подключение к проекту в виде отдельного файла или включения в
существующее пространство имен. Для добавления в проект класса
выберите в меню Project(«Проект») команду Add Class («Добавить
класс»). В открывающемся диалоговом окне введите имя нового класса
в поле Name («Имя») и нажмите кнопку Add («Добавить»). Обратите
внимание, что имя файла (с расширением cs) появится в окне Solution
Explorer («Обозреватель решений») под названием проекта.
Пример ниже содержит классы Point и Program. Класс Point предоставляет точку на плоскости с координатами X и Y. Класс Program
содержит метод Main, создающий экземпляр класса Point и демонстрирующий особенности этого класса.
class Point : Object
{
private int x;
private int y;
public Point(int x, int y)
{
this.x = x;
this.y = y;
}
public int X
{
get { return x; }
set { x = value; }
}
public int Y
{
65

get { return y; }
set { y = value; }
}
public static double Distance(Point a, Point b)
{
double distance;
distance = Math.Sqrt(Math.Pow(b.X - a.X, 2) +
Math.Pow(b.Y - a.Y, 2));
return distance;
}
public virtual double Distance(Point a)
{
double distance;
distance = Math.Sqrt(Math.Pow(X - a.X, 2) + Math.Pow(Y
- a.Y, 2));
return distance;
}
public virtual void Direction()
{
Console.WriteLine("Координата по X = {0}, Y = {1}", x,
y);
}
}
Фактически, каждый класс в С# (за исключением object) наследует
из определения существующего класса. Символ «:» (двоеточие), за которым следует имя класса Object, указывает на то, что класс Point наследует существующие части класса Object. Если определение нового
класса не содержит двоеточия и имени класса справа от имени нового
класса, тогда новый класс неявно наследует из класса Object. Для понимания концепций и программ, представленных в данной главе, разбираться в принципах наследования не обязательно.
66

Левая фигурная скобка ({) и правая фигурная скобка (}) в классе
устанавливают границы тела класса Point. Говорится, что любая информация, помещаемая в этом теле, инкапсулируется (т. е. «упаковывается») в классе. Например, у класса Point объявляются 2 переменные
int: X и Y, представляющие координаты в двухмерном пространстве.
Переменные, объявленные в определении класса, но не в определении
метода, называются переменными экземпляра; каждый экземпляр (объект) класса содержит свою отдельную копию переменных экземпляра
этого класса.
Ключевые слова public и private являются модификаторами доступа
к элементам. В данном примере переменные экземпляра или методы с
модификатором доступа public доступны везде, где программа имеет
ссылку на объект Point. Однако переменные экземпляра или методы,
объявленные с модификатором доступа private, доступны только в определении этого класса.
class Program
{
static void Main(string[] args)
{
Point P2d_1 = new Point(4, 8);
}}
Задача второго класса Program – создание объекта экземпляра клас-
са. Это делается с помощью ключевого слова new. Конструкция
Point P2d_1 = new Point(4, 8); заключает в себе три действия:
Point P2d_1 – объявление экземпляра класса;
new Point(4, 8) – создание объекта;
Point P2d_1 = new Point(4, 8) – возврат и присвоение ссылки объекта эк-
земпляру класса. В следующем разделе мы продолжим разбор данного
примера.
67

7.3. Преобразование из простых типов в сложные
Упаковка-преобразование представляет собой процесс преобразования типа значения в тип object или любой другой ссылочный тип,
реализуемый этим типом значения. Когда тип значения упаковывается
средой CLR, она создает программу-оболочку значения внутри
System.Object и сохраняет ее в управляемой «куче». Операция распаковки-преобразования извлекает тип значения из объекта.
Упаковка-преобразование является неявной; распаковкапреобразование является явной. Концепция упаковки и распаковки лежит в основе единой системы типов C#, в которой значение любого типа можно рассматривать как объект.
В следующем примере выполнена операция упаковкипреобразования целочисленной переменой i, которая присвоена объекту o.
int i = 123;
// Упаковка i.
object o = i;
Можно затем выполнить операцию распаковки-преобразования
объекта o и назначить его целочисленной переменной i:
o = 123;
i = (int)o; // распаковка
По сравнению с простыми операциями присваивания операции
упаковки-преобразования и распаковки-преобразования являются
весьма затратными процессами с точки зрения вычислений. При
выполнении упаковки-преобразования типа значения необходимо
создать и разместить новый объект. Объем вычислений при выполнении
операции распаковки-преобразования тоже весьма значителен, хотя и
вменьший, чем при выполнении упаковки-преобразования.
68

7.4. Вопросы для самопроверки
1. Каково определение понятия «класс»?
2. Каково определение понятия «поле класса»?
3. В чем отличие класса и объекта класса?
4. С какой целью используется упаковка-преобразование?
7.5. Задания для самопроверки
1. Спроектируйте класс типа «Студент»:
– студент обладает ФИО, возрастом;
– студент учится по определенной специальности;
– у студента могут быть отметки за контрольные точки по разным
предметам.
69

8. МЕТОДЫ КЛАССА
8.1. Понятие методов класса
Метод представляет собой блок кода, содержащий набор инструкций. Программа инициирует выполнение операторов, вызывая метод и
задавая необходимые аргументы метода. В C# все инструкции выполняются в контексте метода. Метод Main является точкой входа для каждого приложения C#, и вызывается он средой CLR при запуске программы.
Методы объявляются в классе или в структуре путем указания
уровня доступа, например public или private, необязательных модификаторов, например abstract или sealed, возвращаемого значения, имени
метода и списка параметров этого метода. Все вместе эти элементы образуют подпись метода (сигнатуру).
Тип возвращаемого методом значения не является частью подписи
метода с точки зрения перегрузки методов. В то же время он являются
частью подписи метода при определении совместимости между делегатом и методом, на который он указывает.
Параметры заключаются в круглые скобки и разделяются запятыми. Пустые скобки указывают на то, что у метода нет параметров.
Вызов метода объекта очень похож на обращение к полю. После
имени объекта ставится точка, затем имя метода и скобки. В скобках
перечисляются аргументы, разделенные запятыми.
Определение метода задает имена и типы любых необходимых параметров. Когда код вызова вызывает метод, он предоставляет конкретные
значения, называемые аргументами, для каждого параметра. Аргументы
должны быть совместимыми с типом параметра, но имя параметра (если
таковое имеется), используемое в коде вызова, не должно быть таким же,
как параметр с именем, определенным в методе.
По умолчанию при передаче методу типа значения передается копия объекта, а не сам объект. Поэтому изменения в аргументе не оказы-
70
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
