День пятьсот шестьдесят восьмой. #ЧтоНовенького #CSharp9
Подробнее про Записи в C#9
Записи в C#9 помогут нам создавать неизменяемые типы, которые очень полезны в большой распределенной архитектуре. Поскольку запись ведет себя иначе, чем класс или структура, Microsoft ввели новое ключевое слово record
.
public record Chicken { public string Name {get;init;} }Первичные конструкторы
var c = new Chicken { Name = "test" };
// c.Name = "t"; - изменение значения недопустимо
Ещё интереснее использование записей с первичными конструкторами:
public record Chicken(string name);Фактически есть большой соблазн использовать только первичные конструкторы для объявления записей, чтобы отличать их от объявления классов.
With
С введением записей добавится ещё одно ключевое слово with, которое позволит «клонировать» запись, изменив только некоторые свойства.
var c2 = c with { Name = "myNewName" };Структурное равенство
Записи обладают структурным равенством, то есть две записи считаются равными, если все их свойства равны. Такое поведение сложно реализовать с помощью классических классов, поскольку нужно переопределить методы
Equals
и GetHashCode
и обновлять код этих методов при изменении свойств.Деконструкция
Записи также поддерживают деконструкцию, что позволяет неявно преобразовать запись в кортеж, содержащий все свойства:
public record Decons(int qty, string name, DateTime time);Того же результата можно достичь с помощью метода
var r = new Decons(42, "name", DateTime.Now);
var(x, y, z) = r;
Deconstruct()
, доступного для всех типов записей.Наследование
Поскольку C# - объектно-ориентированный язык, наследование является частью ООП, и его следует поддерживать. Должно быть, это самая серьёзная проблема, которую пришлось преодолеть команде C#, - сделать записи частью языка, сохранив при этом обратную совместимость.
public abstract record Food (int Cal);При этом можно обратиться как к
public record Milk(int C, double Fat) : Food(C);
var m = new Milk(1, 3.25);
m.C
, так и к m.Cal
(они будут равны 1). Но что, если объявить свойства одинаково?public record Milk(int Cal, double Fat) : Food(Cal);У вас останется одно свойство
Cal
, причём оно будет наследовано от Food
. Думаю, это наиболее логичное поведение.Заметьте, что невозможно смешивать классы и записи в цепочке наследования (наследовать класс от записи или наоборот). Однако, вполне возможно, чтобы запись реализовывала интерфейс:
public interface IRecord { }Ограничения обобщений
public record RecordType : IRecord { }
На момент написания невозможно использовать ключевое слово record для ограничения обобщения:
public void Method<T>(T t) where T : recordНадеюсь, к моменту выхода 9й версии это будет поддерживаться.
Источник: https://blog.miguelbernard.com/c-9-0-records/
>>Click here to continue<<