Записи (records)
Записи (records)
Записи (records)
Записи (records)
Записи (records)
Записи (records)
Записи (records)
Записи (records)
Создание записей
Создание записей
Создание записей (позиционный синтаксис )
Создание записей (позиционный синтаксис )
Создание записей (позиционный синтаксис )
Записи (records)
Сравнение объектов
Сравнение объектов
Записи (records)
Неразрушающая мутация
Неразрушающая мутация
1.59M
Категория: ПрограммированиеПрограммирование

ЛК_13_2_Записи

1. Записи (records)

БГУИР кафедра Информатики
ГЛАМАЗДИН И.И. - ДИСЦИПЛИНА: «ПРОГРАММИРОВАНИЕ»
1

2. Записи (records)

ОБЩАЯ ИНФОРМАЦИЯ
БГУИР кафедра Информатики
ГЛАМАЗДИН И.И. - ДИСЦИПЛИНА: «ПРОГРАММИРОВАНИЕ»
2

3. Записи (records)

Начиная с C# 9, ключевое слово record (или record
class) используется для определения ссылочного
типа, который предоставляет встроенные функции
для инкапсуляции данных.
В C# 10 и более поздних версиях вы можете
определять типы record struct
БГУИР кафедра Информатики
ГЛАМАЗДИН И.И. - ДИСЦИПЛИНА: «ПРОГРАММИРОВАНИЕ»
3

4. Записи (records)

Написание неизменяемых (immutable) классов (поля
которых не могут быть изменены после
инициализации) — популярная стратегия упрощения
программного обеспечения и сокращения количества
ошибок.
Это также ключевой аспект функционального
программирования,
в
котором
избегается
изменяемое состояние, а функции рассматриваются
как данные.
БГУИР кафедра Информатики
ГЛАМАЗДИН И.И. - ДИСЦИПЛИНА: «ПРОГРАММИРОВАНИЕ»
4

5. Записи (records)

Чтобы «модифицировать» неизменяемый объект, вы
должны создать новый и скопировать данные, включив
ваши модификации (это называется неразрушающей
мутацией – nondestructive mutation).
Но с точки зрения усилий по кодированию реализация
неразрушающей
мутации
может
быть
очень
неэффективной, особенно при наличии большого
количества свойств. Записи решают эту проблему с
помощью шаблона, поддерживаемого языком.
БГУИР кафедра Информатики
ГЛАМАЗДИН И.И. - ДИСЦИПЛИНА: «ПРОГРАММИРОВАНИЕ»
5

6. Записи (records)

Вторая проблема заключается в том, что программисты —
особенно функциональные программисты — иногда
используют
неизменяемые
классы
просто
для
объединения данных (без добавления поведения).
Определение таких классов требует больше работы, чем
должно быть, требуя, чтобы конструктор присваивал
каждый параметр каждому свойству (деконструктор
также может быть полезен). С записями, компилятор
может сделать эту работу за вас.
БГУИР кафедра Информатики
ГЛАМАЗДИН И.И. - ДИСЦИПЛИНА: «ПРОГРАММИРОВАНИЕ»
6

7. Записи (records)

Наконец, одним из следствий неизменяемости
объекта является то, что его ссылка не может
измениться, а это означает, что для таких типов
полезнее реализовать структурное равенство, чем
ссылочное равенство. Структурное равенство
означает, что два экземпляра одинаковы, если их
данные одинаковы (как в случае с кортежами).
Записи обеспечивают структурное равенство по
умолчанию — без какого-либо шаблонного кода.
БГУИР кафедра Информатики
ГЛАМАЗДИН И.И. - ДИСЦИПЛИНА: «ПРОГРАММИРОВАНИЕ»
7

8. Записи (records)

СОЗДАНИЕ ЗАПИСЕЙ
БГУИР кафедра Информатики
ГЛАМАЗДИН И.И. - ДИСЦИПЛИНА: «ПРОГРАММИРОВАНИЕ»
8

9. Создание записей

internal class Person
{
public int Age { get; init; }
public string Name { get; init; }
public bool OnVacation { get; init; }
public Person(int age, string name, bool onVacation) =>
(Age, Name, OnVacation) = (age, name, onVacation);
}
public void Deconstruct(out int age,
out string name,
out bool onVacation)
=> (age, name, onVacation) = (Age, Name, OnVacation);
БГУИР кафедра Информатики
ГЛАМАЗДИН И.И. - ДИСЦИПЛИНА: «ПРОГРАММИРОВАНИЕ»
9

10. Создание записей

Person person = new(22, "Vova", false);
Console.WriteLine(person);
record Person(int age, string name, bool onVacation);
БГУИР кафедра Информатики
ГЛАМАЗДИН И.И. - ДИСЦИПЛИНА: «ПРОГРАММИРОВАНИЕ»
10

11. Создание записей (позиционный синтаксис )

При использовании позиционного синтаксиса для
определения свойства компилятор создает:
Общедоступное
автоматически
реализуемое
свойство для каждого позиционного параметра,
предоставленного в объявлении записи.
Для типов record и readonly record struct :
свойство только для инициализации .
Для record struct типов: свойство для чтения и
записи.
БГУИР кафедра Информатики
ГЛАМАЗДИН И.И. - ДИСЦИПЛИНА: «ПРОГРАММИРОВАНИЕ»
11

12. Создание записей (позиционный синтаксис )

При использовании позиционного синтаксиса
для определения свойства компилятор создает:
Первичный конструктор, параметры которого
соответствуют позиционным параметрам в
объявлении записи.
Для типов record struct — конструктор без
параметров, который устанавливает для
каждого поля значение по умолчанию.
БГУИР кафедра Информатики
ГЛАМАЗДИН И.И. - ДИСЦИПЛИНА: «ПРОГРАММИРОВАНИЕ»
12

13. Создание записей (позиционный синтаксис )

При использовании позиционного синтаксиса для
определения свойства компилятор создает:
Метод Deconstruct с параметром out для каждого
позиционного
параметра,
указанного
в
объявлении записи. Метод деконструирует
свойства,
определенные
с
помощью
позиционного синтаксиса; он игнорирует свойства,
определенные с использованием стандартного
синтаксиса свойств.
БГУИР кафедра Информатики
ГЛАМАЗДИН И.И. - ДИСЦИПЛИНА: «ПРОГРАММИРОВАНИЕ»
13

14. Записи (records)

СРАВНЕНИЕ ОБЪЕКТОВ
БГУИР кафедра Информатики
ГЛАМАЗДИН И.И. - ДИСЦИПЛИНА: «ПРОГРАММИРОВАНИЕ»
14

15. Сравнение объектов

Если вы не переопределяете Equals или не перегружаете
operator ==, сравнение выполняется по правилу:
Для типов class два объекта равны, если они ссылаются
на один и тот же объект в памяти.
Для типов struct два объекта равны, если они относятся
к одному типу и хранят одни и те же значения.
Для типов record, включая record struct и readonly record
struct, два объекта равны, если они относятся к одному
типу и хранят одинаковые значения.
БГУИР кафедра Информатики
ГЛАМАЗДИН И.И. - ДИСЦИПЛИНА: «ПРОГРАММИРОВАНИЕ»
15

16. Сравнение объектов

Person person = new(22, "Vova", false);
Person person1 = new(22, "Vova", false);
Console.WriteLine(person==person1);
БГУИР кафедра Информатики
ГЛАМАЗДИН И.И. - ДИСЦИПЛИНА: «ПРОГРАММИРОВАНИЕ»
16

17. Записи (records)

НЕРАЗРУШАЮЩАЯ МУТАЦИЯ
БГУИР кафедра Информатики
ГЛАМАЗДИН И.И. - ДИСЦИПЛИНА: «ПРОГРАММИРОВАНИЕ»
17

18. Неразрушающая мутация

Простое клонирование объекта:
Person person = new(22, "Vova", false);
Person person1 = person;
БГУИР кафедра Информатики
ГЛАМАЗДИН И.И. - ДИСЦИПЛИНА: «ПРОГРАММИРОВАНИЕ»
18

19. Неразрушающая мутация

Копирование объекта с измененными данными:
Person person = new(22, "Vova", false);
Person person1 = person with { age=33};
Console.WriteLine(person);
Console.WriteLine(person1);
БГУИР кафедра Информатики
ГЛАМАЗДИН И.И. - ДИСЦИПЛИНА: «ПРОГРАММИРОВАНИЕ»
19
English     Русский Правила