Similar presentations:
Лекция_7_2025
1. АЛГОРИТМИЗАЦИЯ И ПРОГРАММИРОВАНИЕ
12. Возвращение значения из switch
Конструкция switch позволяет возвращать некоторое значение.возвращения значения в блоках case может применятся оператор return.
using System;
class HelloWorld {
static int DoOperation(int op, int a, int b)
{
switch (op)
{
case 1: return a + b;
case 2: return a - b;
case 3: return a * b;
default: return 0;
}
}
static void Main() {
int result1 = DoOperation(1, 10, 5);
Console.WriteLine($"Первый результат работы= {result1}"); // 15
Для
int result2 = DoOperation(3, 10, 5);
Console.WriteLine($"Второй результат работы= {result2}"); // 50
}
}
2
3. Возвращение значения из switch
using System;class HelloWorld
{
static int DoOperation(int op, int a, int b)
{
int result = op switch
{
1 => a + b,
2 => a - b,
3 => a * b,
_ => 0
};
return result;
}
static void Main()
{
int result1 = DoOperation(1, 10, 5);
Console.WriteLine($"Первый результат работы= {result1}"); // 15
int result2 = DoOperation(3, 10, 5);
Console.WriteLine($"Второй результат работы= {result2}"); // 50
}
}
3
4. Возвращение значения из switch
using System;class HelloWorld
{
static int DoOperation(int op, int a, int b)
{
return op switch
{
1 => a + b,
2 => a - b,
3 => a * b,
_ => 0
};
}
static void Main()
{
int result1 = DoOperation(1, 10, 5);
Console.WriteLine($"Первый результат работы= {result1}"); // 15
int result2 = DoOperation(3, 10, 5);
Console.WriteLine($"Второй результат работы= {result2}"); // 50
}
}
4
5. Рекурсивные функции
Рекурсивная функция представляет конструкцию, при которой функциявызывает саму себя.
При создании рекурсивной функции в ней обязательно должен быть
некоторый базовый вариант, с которого начинается вычисление функции
(глубина рекурсии).
Для возвращения базового варианта применяется оператор return.
Все рекурсивные вызовы должны обращаться к подфункциям, которые в конце
концов сходятся к базовому варианту:
5
6. Ghbvth
using System;class HelloWorld
{
static int Factorial(int n)
{
if (n == 1) return 1;
return n * Factorial(n - 1);
}
static void Main()
{
int factorial4 = Factorial(4);
int factorial5 = Factorial(5);
int factorial6 = Factorial(6);
Console.WriteLine($"Факториал числа 4 = {factorial4}");
Console.WriteLine($"Факториал числа 5 = {factorial5}");
Console.WriteLine($"Факториал числа 6 = {factorial6}");
Console.WriteLine($"Факториал числа 4 = {Factorial(4)}");
Console.WriteLine($"Факториал числа 5 = {Factorial(5)}");
Console.WriteLine($"Факториал числа 6 = {Factorial(6)}");
}
}
6
7. Пример
using System;class HelloWorld
{
static int Fibonachi(int n)
{
if (n == 0 || n == 1) return n;
return Fibonachi(n - 1) + Fibonachi(n - 2);
}
static void Main()
{
int fib4 = Fibonachi(4);
int fib5 = Fibonachi(5);
int fib6 = Fibonachi(6);
Console.WriteLine($"4 число Фибоначчи = {fib4}");
Console.WriteLine($"5 число Фибоначчи = {fib5}");
Console.WriteLine($"6 число Фибоначчи = {fib6}");
}
}
7
8. Пример
Вместо рекурсий можно использовать циклические конструкции. Программы наоснове циклов работают быстрее и более эффективны, чем рекурсия.
using System;
class HelloWorld
{
static int Fibonachi(int n)
{
static void Main()
int f0 = 0;
{
int f1 = 1;
int fib4 = Fibonachi(4);
int f;
int fib5 = Fibonachi(5);
for (int i = 2; i <=n; i++)
int fib6 = Fibonachi(6);
{
Console.WriteLine($"4 число Фибоначчи = {fib4}");
Console.WriteLine($"5 число Фибоначчи = {fib5}");
f = f0 + f1;
Console.WriteLine($"6 число Фибоначчи = {fib6}");
f0 = f1;
}
f1 = f;
}
}
return f1;
}
8
9. Объектно-ориентированное программирование Введение. Эволюция технологии разработки ПО. Процедурная и объектная декомпозиция
1.«Стихийное» программирование – до середины 60-х годов ХХ
века используется процедурная декомпозиция.
Основная программа
Программа
Данные
Данные
1
2
...
n
Подпрограммы
Слабое место – большая вероятность испортить
глобальные данные.
9
10. Эволюция технологии разработки ПО
2. Структурный подход к программированию - 60-70-е годы ХХ века –технология, представляющая собой набор рекомендаций и
методов, базирующихся на большом опыте работы:
• нисходящая разработка;
• декомпозиция методом пошаговой детализации;
• структурное программирование;
• сквозной структурный контроль и т. д.
Основная пр ограмма
Глобальные данные
Данные
Данные
1
2
...
Данные
n1
Подпр ограммы с локальными данными
10
11. Эволюция технологии разработки ПО
Модульное программирование – выделение групп подпрограмм,использующих общие глобальные данные в модули – отдельно
компилируемые
части
программы
(многоуровневая
декомпозиция).
Основная пр огр амма
Глобальные данные
М оду ль 1
М оду ль k
Данные
Данные
Данные
...
Данные
1
n1
Подпр ограммы с
локальными данными
...
Данные
...
Данные
1
nk
Подпр ограммы с
локальными данными
М оду ли с локальными данными и попр огр аммами
Слабое место – большое
количество передаваемых параметров.
11
12. Эволюция технологии разработки ПО
3.Объектный подход к
программированию
–
с середины 80-х до наших
дней.
Объектноориентированное
программирование
–
технология
создания
сложного
программного
обеспечения, основанная
на
представлении
программы
в
виде
системы
объектов,
каждый
из
которых
является
экземпляром
определенного
типа
(класса),
а
классы
образуют
иерархию с
наследованием свойств.
Объект 1
Данные
Данные
...
Данные
1
n1
Подпрограммы с
локальными данными
Сообщения
Данные
Объект 2
Объект S
Данные
Данные
...
...
Данные
Данные
1
n1
Подпрограммы с
локальными данными
...
Данные
1
nk
Подпрограммы с
локальными данными
Сообщения
Объект L
Данные
Данные
...
Данные
1
n1
Подпрограммы с
локальными данными
12
13. Объектный подход к программированию
Для объектно-ориентированного программирования основными принципамиявляются:
• абстагирование
• инкапсуляция
• наследование
• полиморфизм
Абстрагирование подразумевает собой процесс изменения уровня
детализации программы. Основная его роль – выделение существенных
характеристик некоторого объекта, отличающие его от всех других видов
объектов и, таким образом, четкое определение его концептуальных
границ с точки зрения наблюдателя.
Инкапсуляция это объединение в едином объекте данных и кодов,
оперирующих с этими данными. В терминологии объектноориентированного программирования данные называются экземплярами
данных (data members) объекта, а коды - объектными методами или
функциями-членами (methods, member functions)
Инкапсуляция организует защиту информации от ненужных и случайных
модификаций, что обеспечивает целостность данных и упрощает отладку
программного кода после изменений.
13
14. Объектный подход к программированию
Все компоненты объекта разделяются на интерфейс и внутреннююреализацию.
Интерфейс - это лицевая сторона объекта, способ работы со стороны его
программного окружения – других объектов, модулей программы. В
интерфейсной части описывается, что умеет делать объект.
Внутренняя реализация объекта представляет собой те компоненты класса,
которые не должны быть доступны извне. Реализация объекта определяет,
как он выполняет задание, поступающее от интерфейсных компонент.
Использование интерфейсного элемента приводит в действие механизмы
внутренней реализации.
Таким образом, инкапсуляция реализует в объектно-ориентированном
программировании принципы, предложенные Д. Парнасом:
• Разработчик программы должен предоставлять пользователю всю
информацию, которая нужна для эффективного использования
приложения, и ничего кроме этого.
• Разработчик программного обеспечения должен знать только требуемое
поведение объекта и ничего кроме этого.
14
15. Диаграмма состояний интерфейса пользователя
Вводфункции
«Конец»
4
Меню
1
2
Таблица
Корни
3
Экстремумы
15
16. Объектный подход к программированию
Наследование состоит в процессе создания новых объектов (потомков) наоснове уже имеющихся объектов (предков) с передачей их свойств и
методов по наследству.
Наследование позволяет модифицировать
поведение
объектов
и
придает
объектно-ориентированному
программированию исключительную гибкость.
Преимущество принципа наследования заключается в повторном
использовании кода, когда каждый новый объект не создается с нуля, а
строится на фундаменте уже существующего объекта. При этом
уменьшается как размер кода, так и сложность программы.
Благодаря использованию принципа наследования в современные системы
программирования включены библиотеки классов, которые представляют
собой многоуровневые иерархические системы классов, описывающих
элементы программного или пользовательского интерфейса прикладной
программы.
В основе подобных систем лежат базовые классы, которые обычно очень
просты и являются обобщением свойств всех остальных классов
библиотеки. Классы-потомки базовых дополняются собственными
свойствами, приобретая дополнительную функциональность.
16
17. Объектный подход к программированию
Полиморфизм – это свойство родственных объектов (то есть тех объектов,классы которых являются производными от одного родителя) вести себя
по-разному в зависимости от ситуации, возникающей в момент
выполнения программы. Полиморфизм происходит от греческих слов
poly (много) и morphos (форма) и означает множественность форм
методов объектов.
Если в объекте-потомке и объекте-родителе определены одноименные
методы, имеющие разную кодовую реализацию (это называется
перегрузкой метода в объекте-потомке), то вызов данного метода может
быть привязан к его конкретной реализации в одном из родственных
объектов только в момент выполнения программы. Это называется
поздним связыванием, а методы, реализующие позднее связывание –
полиморфными или виртуальными.
17
18. Объектная декомпозиция
Объектная декомпозиция – процесс представления предметнойобласти задачи в виде отдельных функциональных элементов
(объектов предметной области), обменивающихся в процессе
выполнения программы входными воздействиями (сообщениями) .
Объект отвечает за выполнение некоторых действий, инициируемых
сообщениями и зависящих от параметров объекта.
Активизировать
Ввод
функции
Задать
Активизировать
Меню
Активизировать
Активизировать
Активизировать
Таблица
Корни
Рассчитать
Рассчитать
Функция
Экстремумы
Рассчитать
Объект предметной области
характеризуется:
именем;
состоянием;
поведением.
Состояние – совокупность
значений характеристик
объекта, существенных с
т. з. решаемой задачи.
Поведение – совокупность
реакций на сообщения.
18
19. Реализация объектов предметной области
Имя объектаИмя класса
Имя объекта
Состояние
Поля
Значения
Поведение
Методы
Методы
Класс
Объектпеременная
Объект
предметной
области
Класс – это структурный тип данных, который включает описание
полей данных, а также процедур и функций, работающих с этими
полями данных.
Применительно к классам такие процедуры и функции получили
название методов.
Объект-переменная – переменная типа «класс».
19
20. Методы построения классов
1. Наследование – механизм, позволяющийстроить класс на базе более простого
посредством добавления полей и определения
новых методов.
При этом исходный класс, на базе которого
выполняется
построение,
называют
родительским или базовым, а строящейся класс
– потомком или производным классом.
Если при наследовании какие-либо методы
переопределяются, то такое наследование
называется полиморфным.
2. Композиция – механизм, позволяющий
включать несколько объектов других
классов в конструируемый.
Класс3. Наполнение – механизм, позволяющих
часть
включать указатели на объекты других
классов в конструируемый.
Классчасть
Классродитель
Класспотомок
1
0..*
1
Основной
класс
Классагрегат
20
21. КЛАССЫ
Классы – основа любого объектно-ориентированного языка. Класспредставляет собой некоторый шаблон, по которому будут создаваться
объекты определенного типа. Внутри класса содержатся какие-либо данные
и методы их обработки.
Класс – это ряд схематических описаний способа построения объекта.
Класс является логической абстракцией, т. е. физическое представление класса
появится в оперативной памяти только после создания объекта этого класса.
Если говорить в терминах объектно-ориентированного программирования, то
класс – это инкапсуляция данных и методов обработки этих данных.
Общая форма определения класса содержит данные и функции.
Данными класса могут быть поля, константы, события.
Поля – это любые переменные, относящиеся к классу.
Константы могут быть ассоциированы с классом так же, как и переменные.
При объявлении константы используется ключевое слово сonst.
События – это члены класса, которые уведомляют программный код о том, что
случилось что-то важное, заслуживающее внимания, например, изменилось
какое-либо свойство класса или произошло взаимодействие с
пользователем.
21
22. КЛАССЫ
Функциями класса могут быть методы, конструкторы, свойства, операции,финализаторы.
Методы – это функции, определяющие поведение объектов класса. Методы
служат для обработки данных.
Свойства – это видимые извне признаки класса. Если провести параллель с
человеком, то свойствами могут быть цвет глаз и волос, рост, масса, возраст
и т. д.
Конструкторы – специальные функции, используемые для инициализации
объектов класса в процессе их реализации.
Финализаторы – функции, которые вызываются, когда среда определяет, что
объект больше не нужен. Имя этих функций совпадает с именем класса.
Операции – это простейшие действия типа сложения или вычитания. В языке
С# имеется возможность указать, как существующие операции будут
взаимодействовать с пользовательскими классами (это еще называют
перегрузкой операций).
22
23. МОДИФИКАТОРЫ ДОСТУПА
Модификаторы доступа используются для задания степени видимости илидоступности какого-либо члена класса для кода программы, который
находится за пределами класса.
Модификаторы доступа могут быть следующих видов:
public – член класса доступен вне определения класса и в производных
классах;
protected – член класса невидим за пределами класса, но к нему могут
обращатся производные классы;
private – член класса не доступен за пределами класса. При этом доступ к этим
членам для производных классов также закрыт;
internal – члена класса доступен только в пределах текущей единицы
компиляции.
В языке С# для членов класса по умолчанию используется модификатор
доступа private, т. е. если явно не указать модификатор доступа
переменной, то будет использован модификатор private.
23
24. Описание класса
Класс – это определяемый пользователем тип данных, описывающий с точкизрения объектно-ориентированного программирования некоторый объект
из предметной области решаемой задачи.
Объект – это экземпляр класса, переменная типа, описываемого классом.
Таким образом, разница между понятиями класс и объект схожа с разницей
между понятиями «тип данных» и «экземпляр типа». Объект существует в
памяти, класс же является шаблоном, по которому создается объект.
C# является полноценным объектно-ориентированным языком. Программу на
C# можно представить в виде взаимосвязанных взаимодействующих между
собой объектов.
Класс определяет тип объекта, но не является объектом.
Класс представляет новый тип, который определяется пользователем. Класс
определяется с помощью ключевого слова сlass:
class название_класса
{
// содержимое класса
}
Имя класса принято начинать с большой буквы, последующие слова в
24
имени также должны начинаться с большой буквы.
25. Описание класса
После определения класса можно создавать его объекты. Для создания объектаприменяются конструкторы.
Конструкторы представляют специальные методы, которые называются так же
как и класс, и которые вызываются при создании нового объекта класса и
выполняют инициализацию объекта. Общий синтаксис вызова
конструктора:
new конструктор_класса(параметры_конструктора);
Пример:
Объекты создается с помощью new ключевого слова, за которым следует имя
класса, на котором будет основываться объект, например:
Customer object1 = new Customer();
При создании экземпляра класса передается ссылка на объект. В
примере object1 представляет собой ссылку на объект, который основан
на Customer. Эта ссылка указывает на новый объект, но не содержит
данные этого объекта.
Можно создать ссылку на объект без создания собственно объекта:
Customer object2;
25
26. Описание класса
Не рекомендуется создавать такие ссылки на объекты, которые нессылаются на объект, так как попытка доступа к объекту через такую
ссылку приведет к сбою во время выполнения.
Такую ссылку можно сделать указывающей на объект, создав новый объект
или назначив ее существующему объекту:
Customer object3 = new Customer();
Customer object4 = object3;
В этом коде создаются две ссылки на объект, которые указывают на один и тот
же объект. Таким образом, любые изменения объекта, выполненные
посредством object3, отражаются при последующем использовании object4.
Поскольку на объекты, основанные на классах, указывают ссылки, классы
называют ссылочными типами.
Конструктор по умолчанию
Если в классе не определено ни одного конструктора, то для этого класса
автоматически создается пустой конструктор по умолчанию, который не
принимает никаких параметров.
26
27. Описание класса
На уровне кода конструктор представляет метод, который называется по именикласса, который может иметь параметры, но для него не надо определять
возвращаемый тип.
Ключевое слово this
Ключевое слово this представляет ссылку на текущий экземпляр/объект
класса.
Используется чтобы разграничить параметры и поля класса, к полям класса
обращение идет через ключевое слово this. Так, в выражении
this.name = name;
первая часть - this.name означает, что name - это поле текущего класса, а не
название параметра name. Если бы параметры и поля назывались поразному, то использовать слово this было бы необязательно. Также через
ключевое слово this можно обращаться к любому полю или методу.
27
28. Описание класса
Поля и методы классаКласс может хранить некоторые данные. Для хранения данных в классе
применяются поля. Поля класса - это переменные, определенные на уровне
класса.
Класс может определять некоторое поведение или выполняемые действия. Для
определения поведения в классе применяются методы.
При определении полей можно присвоить им некоторые значения. Если поля
класса не инициализированы, то они получают значения по умолчанию. Для
переменных числовых типов это число 0.
Обращение к функциональности класса
Для обращения к функциональности класса - полям, методам (а также другим
элементам класса) применяется точечная нотация точки - после объекта
класса ставится точка, а затем элемент класса:
объект.поле_класса
объект.метод_класса(параметры_метода)
28
29. ИНИЦИАЛИЗАЦИЯ КЛАССОВ И КОНСТРУКТОРЫ
Синтаксис определения класса, который содержит только переменные иметоды:
class имя_класса {
//Объявление переменных экземпляра.
доступ тип переменная1;
//…
доступ тип переменнаяN;
//Объявление методов.
доступ возращаемый_тип метод1 (параметры)
{
//тело метода
}
доступ возращаемый_тип метод2 (параметры)
{
//тело метода
}
//...
}
29
30. ИНИЦИАЛИЗАЦИЯ КЛАССОВ И КОНСТРУКТОРЫ
ПРИМЕРопределения класса, описывающего некоторого студента вуза. Код будет
выглядеть следующим образом:
using System;
namespace Primer
{
class Student
{
//характеристики объекта класса доступны только внутри данного
класса
private string name;
private string fname;
private int kurs;
private string adress;
private int tel;
static void Main()
{
}
}
30
}
31. ИНИЦИАЛИЗАЦИЯ КЛАССОВ И КОНСТРУКТОРЫ
ПРИМЕРОпределяется конструктор класса для создания объектов данного
класса в скобках указаны параметры, которые передаются методу для
создания объекта с указанными свойствами
using System;
namespace Primer
{
class Student
{
//характеристики объекта класса доступны только внутри данного класса
private string name;
private string fname;
private int kurs;
private string adress;
private int tel;
31
32. ИНИЦИАЛИЗАЦИЯ КЛАССОВ И КОНСТРУКТОРЫ
ПРИМЕРpublic Student(string name, string fname, int kurs, string adress, int tel)
{
this.name = name;
this.fname = fname;
this.kurs = kurs;
this.adress = adress;
this.tel = tel;
}
//определяется метод для объекта класса (его поведение)
//метод будет выводить на экран информацию о студенте
public void Print()
{
Console.WriteLine("Имя\t"+name +"\nФамилия\t"+fname
+"\nКурс\t"+kurs +"\nАдрес\t"+adress +"\nТелефон\t"+tel +"\n");
}
static void Main()
{
}
}}
32
33. ИНИЦИАЛИЗАЦИЯ КЛАССОВ И КОНСТРУКТОРЫ
ПРИМЕРusing System;
namespace Primer
{
class Student
{
//характеристики объекта класса доступны только внутри данного класса
private string name;
private string fname;
private int kurs;
private string adress;
private int tel;
public Student(string name, string fname, int kurs, string adress, int tel)
{
this.name = name;
this.fname = fname;
this.kurs = kurs;
this.adress = adress;
this.tel = tel;
}
33
34. ИНИЦИАЛИЗАЦИЯ КЛАССОВ И КОНСТРУКТОРЫ
ПРИМЕР//определяется метод для объекта класса (его поведение)
//метод будет выводить на экран информацию о студенте
public void Print()
{
Console.WriteLine("Имя\t"+name +"\nФамилия\t"+fname +"\nКурс\t"+kurs
+"\nАдрес\t"+adress +"\nТелефон\t"+tel +"\n");
}
static void Main()
{
//создается первый объект класса
Student St1 = new Student("Иван", "Иванов", 1, "Ленина, 50–25", 3251565);
//создаем второй объект нашего класса
Student St2 = new Student("Петр", "Петров", 2, "Мира, 15–3", 2256580);
//используется метод вывода на экран информации о студентах,
//определенный ранее в классе
St1.Print();
St2.Print();
}
}}
34
35. ИНИЦИАЛИЗАЦИЯ КЛАССОВ И КОНСТРУКТОРЫ
ПРИМЕРПусть есть класс MyCar.
Пусть у автомобиля есть такие характеристики (поля):
• марка (Type),
• имя владельца (Name),
• скорость (Speed).
Тогда функция, которая будет задавать эти поля, должна иметь в своем
заголовке эти три параметра (string Type, string Name, float Speed).
Имя функции совпадает с именем класса.
MyCar(string Type, string Name, float Speed)
{
type=Type;
name=Name;
speed=Speed;
}
35
36. ИНИЦИАЛИЗАЦИЯ КЛАССОВ И КОНСТРУКТОРЫ
Если необходимо создать конкретный объект, например автомобиль можнозаписать:
MyCar M_car = new MyCar("Porshe", “Мечта", 250.0);
По этому оператору конструктор создаст объект с именем M_car, оператор new
разместит объект (или — экземпляр класса MyCar) в динамической куче и
выдаст адрес начала объекта в этой куче. Адрес будет положен на полочку
для переменной M_car.
Простейший вид описания класса такой:
сlass Car
{
}
Здесь class - ключевое слово, Car - имя класса. Если в классе конструктор не
указывается, то он по умолчанию берется из класса Object - специального
класса, из которого берут свое начало остальные классы.
36
37. ИНИЦИАЛИЗАЦИЯ КЛАССОВ И КОНСТРУКТОРЫ
Конструкторов может быть более одного, потому что может потребоватьсясоздавать объекты класса на основе не всех полей, а некоторых. Но все
конструкторы должны обязательно иметь имя класса, но с разными
параметрами.
Пример
Программа, в которой создается класс с тремя конструкторами и одним
методом обработки полей класса.
using System;
namespace appclass
{
class MyCar
{
private string name;
private int speed;
private string fname;
37
38. ИНИЦИАЛИЗАЦИЯ КЛАССОВ И КОНСТРУКТОРЫ
// Конструктор классаpublic MyCar(string Name, int Speed, string Fname)
{
name = Name;
speed = Speed;
fname = Fname;
}
// Второй конструктор класса
public MyCar(string Name, int Speed)
{
name = Name;
speed = Speed;
}
// Третий конструктор класса
public MyCar()
// Метод1 класса
{
public int M1()
name = "Форд";
{
speed = 120;
speed = speed * 2;
fname = "Иванов";
return (0);
}
}
38
39. ИНИЦИАЛИЗАЦИЯ КЛАССОВ И КОНСТРУКТОРЫ
// classpublic static void Main()
{
MyCar car = new MyCar("Лада", 70, "Петров");
car.M1();
Console.WriteLine("Машина\t" + car.name + "\nВладелец\t" +
car.fname + "\nСкорость\t" + car.speed + "\n");
// car уже выше объявлена как тип MyCar
car = new MyCar("Тойота", 20);
car.M1();
Console.WriteLine("Машина\t" + car.name + "\nВладелец\t" +
car.fname + "\nСкорость\t" + car.speed + "\n");
car = new MyCar();
car.M1();
Console.WriteLine("Машина\t" + car.name + "\nВладелец\t" +
car.fname + "\nСкорость\t" + car.speed + "\n");
}
}
}
39
40. ИНИЦИАЛИЗАЦИЯ КЛАССОВ И КОНСТРУКТОРЫ
4041. ИНИЦИАЛИЗАЦИЯ КЛАССОВ И КОНСТРУКТОРЫ
ПРИМЕРusing System;
namespace appclass
{
class Person
{
public string name;
public int age;
public Person() { name = "Неизвестно"; age = 18; }
public Person(string n) { name = n; age = 18; }
public Person(string n, int a) { name = n; age = a; }
public void Print()
{
Console.WriteLine($"Имя: {name} Возраст: {age}");
}
41
42. ИНИЦИАЛИЗАЦИЯ КЛАССОВ И КОНСТРУКТОРЫ
ПРИМЕРpublic static void Main()
{
Person tom = new Person();
Person bob = new Person("Иван");
Person sam = new Person("Петр", 25);
tom.Print();
bob.Print();
sam.Print();
}
}
}
В примере определены три конструктора. Все три конструктора выполняют
однотипные действия - устанавливают значения полей name и age.
42
43. ИНИЦИАЛИЗАЦИЯ КЛАССОВ И КОНСТРУКТОРЫ
ПРИМЕРМожно не дублировать функциональность конструкторов, а просто обращаться
из одного конструктора к другому также через ключевое слово this,
передавая нужные значения для параметров:
using System;
namespace appclass
{
class Person
{
public string name;
public int age;
public Person() : this("Неизвестно")
{}
public Person(string name) : this(name, 18)
{}
public Person(string name, int age)
{
this.name = name;
this.age = age;
43
}
44. ИНИЦИАЛИЗАЦИЯ КЛАССОВ И КОНСТРУКТОРЫ
ПРИМЕРpublic void Print()
{
Console.WriteLine($"Имя: {name} Возраст: {age}");
}
public static void Main()
{
Person tom = new Person();
Person bob = new Person("Иван");
Person sam = new Person("Петр", 25);
tom.Print();
bob.Print();
sam.Print();
}
}
}
44
45. ИНИЦИАЛИЗАЦИЯ КЛАССОВ И КОНСТРУКТОРЫ
ПРИМЕРВ данном случае первый конструктор вызывает второй, а второй конструктор
вызывает третий. По количеству и типу параметров компилятор узнает,
какой именно конструктор вызывается. Например, во втором конструкторе:
public Person(string name) : this(name, 18)
{}
идет обращение к третьему конструктору, которому передаются два значения.
Причем в начале будет выполняться именно третий конструктор, и только
потом код второго конструктора.
В примере выше фактически все конструкторы не определяют каких-то других
действий, кроме как передают третьему конструктору некоторые значения.
Поэтому в реальности в данном случае проще оставить один конструктор,
определив для его параметров значения по умолчанию:
public Person(string name = "Неизвестно", int age = 18)
{
this.name = name;
this.age = age;
}
45
46. ИНИЦИАЛИЗАЦИЯ КЛАССОВ И КОНСТРУКТОРЫ
ПРИМЕРusing System;
namespace appclass
{
class Person
{
public string name;
public int age;
public Person(string name = "Неизвестно", int age = 18)
{
this.name = name;
this.age = age;
}
public void Print()
{
Console.WriteLine($"Имя: {name} Возраст: {age}");
}
public static void Main()
{
Person tom = new Person();
Person bob = new Person("Иван");
Person sam = new Person("Петр", 25);
tom.Print();
bob.Print();
sam.Print();
}
}
}
46
47. ИНИЦИАЛИЗАЦИЯ КЛАССОВ И КОНСТРУКТОРЫ
С помощью инициализатора объектов можно присваивать значения всемдоступным полям и свойствам объекта в момент создания. При
использовании инициализаторов следует учитывать следующие моменты:
• С помощью инициализатора можно установить значения только доступных
из вне класса полей и свойств объекта. Например, в примере выше поля
name и age имеют модификатор доступа public, поэтому они доступны из
любой части программы.
• Инициализатор выполняется после конструктора, поэтому если и в
конструкторе, и в инициализаторе устанавливаются значения одних и тех же
полей и свойств, то значения, устанавливаемые в конструкторе, заменяются
значениями из инициализатора.
47
48. ДЕКОНСТРУКТОРЫ
Деконструкторы позволяют выполнить декомпозицию объекта на отдельныечасти.
Например, пусть есть следующий класс Person:
class Person
{
string name;
int age;
public Person(string name, int age)
{
this.name = name;
this.age = age;
}
public void Deconstruct(out string personName, out int personAge)
{
personName = name;
personAge = age;
}
}
48
programming