КОНЦЕПЦИИ C #

Записи - C # 9.0

Последние и наиболее ожидаемые записи функций, которые позволяют создавать неизменяемые типы данных.

Самый простой способ представить записи как неизменные классы. По функциям они напоминают кортежи. Другими словами, настраиваемые кортежи со свойствами и неизменяемостью.

Рассмотрим следующий пример записи, которая фиксирует такие данные регистрации, как имя, фамилия и адрес электронной почты.

Синтаксис записи

Записи - это специализированные классы.

public record SignUp(
   string firstName,
   string lastName,
   string Email
);

Вышеуказанная запись идентична приведенному ниже определению класса

Как описано выше, варианты записи и класса практически идентичны. Запись дает более расширенное функциональное поведение.

Что общего между записью и классом?

  • Конструктор
  • Неизменность
  • Копировать семантику

Что особенного в записях?

  • Равенство записей работает с содержимым, тогда как равенство классов работает с определением объекта.
  • Записи обеспечивают GetHashCode() реализацию, основанную на содержании записи.
  • Запись ToString () переопределяется для отображения свойств записи.

Пример кода для иллюстрации различий

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

Выход

Выходные данные ниже показывают, что записи равны, тогда как два разных объекта класса не равны с использованием оператора «==».

Records equality: True
Class equality: False

Другой синтаксис записи

Существуют различные схемы объявления записей для различных случаев использования.

Синтаксис одного лайнера

Первый шаблон самый простой, однострочный, но он наименее гибок. Это хорошо для записей с небольшим количеством обязательных свойств.

Вот запись SignUp, показанная ранее, как пример этого шаблона.

public record SignUp(
   string firstName,
   string lastName,
   string Email
);

Он соответствует требованиям конструктора с параметрами.

var SignUp = new SignUp("sukhpinder", "singh", "email");

Синтаксис целевой печати

SignUp signup= new("sukhpinder", "singh", "email");

Синтаксис с необязательными параметрами

В приведенном ниже синтаксисе указаны firstName и lastName - обязательные поля, а Email - необязательное поле.

public record SignUp(string firstName, string lastName)
{
    public string Email{get; init;}
}

Конструкция может выглядеть следующим образом с Email неуказанным.

SignUp signUp= new("Sukhpinder", "Singh");

И с Email specified.

SignUp signUp= new("Sukhpinder", "Singh")
{
    Email = true
};

Неразрушающая мутация записи

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

Как это сделать, не отказываясь от неизменности?

Выражение with отвечает потребностям. Это облегчает формирование новой записи в терминах текущей записи того же типа.

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

Давайте преобразуем имя в нижний регистр.

SignUp signup= new("sukhpinder", "singh", "email");
SignUp signupLowerCase= signup with {
   firstName= signup.firstName.ToLowerInvariant()
};

Мы можем проверить, что with выполнило то, что мы ожидали, с помощью встроенного ToString() переопределения.

Console.WriteLine(signup);
Console.WriteLine(signupLowerCase);

Этот код дает следующий результат.

SignUp{firstName = "Sukhpinder",lastName= "singh", Email= "email"}
SignUp{firstName = "sukhpinder",lastName= "singh", Email= "email"}

Запись наследования

Давайте расширим signup запись до google signup.

public record SignUp(
   string firstName,
   string lastName,
   string Email
);

Новый google signup похож на наследование.

publuc record GSignup(string firstName,string x):SignUp(firstName){
   public string googleProperty{get;init;}
}

У меня есть новое свойство x типа string, а также новый необязательный параметр с именем googleProperty. firstName унаследован от Signup record.

Спасибо за чтение. Надеюсь, статья вам понравилась .. !!