Информация об изменениях

Сообщение Re[2]: record, mutable field? от 04.01.2021 16:42

Изменено 04.01.2021 16:43 Silver_S

Re[2]: record, mutable field?
S_S>Если в record хочется добавить вычисляемое get property, но надо закешировать результат в mutable field (больше некуда). Как этот field исключить из ToString, GetHashCode, Equals?
S_S>Если вручную переопределять все GetHashCode, Equals, ToString, то половина преимуществ record пропадает.

Хотя обходные пути есть — добавить это поле в производном record, а переопределения GetHashCode,.. направить на base.
Но плохо, что конструктор надо снова переопределять. Если был краткий primary конструктор, то много лишней писанины.

Лучше бы сделали, чтобы в производном record, в таких конструкторах неявно добавлялись параметры из base record.
public record Rec1(int Prop1)
{
    public int Prop1 { get; init; }
}

public record Rec2(int Prop2) : Rec1 // Ошибка. В производном такие конструкторы нельзя. Если в базовом нет без параметров. Лучше бы неявно превращался в конструктор: Rec2(int Prop1, int Prop2)
{
}
Re[2]: record, mutable field?
S_S>Если в record хочется добавить вычисляемое get property, но надо закешировать результат в mutable field (больше некуда). Как этот field исключить из ToString, GetHashCode, Equals?
S_S>Если вручную переопределять все GetHashCode, Equals, ToString, то половина преимуществ record пропадает.

Хотя обходные пути есть — добавить это поле в производном record, а переопределения GetHashCode,.. направить на base.
Но плохо, что конструктор надо снова переопределять. Если был краткий primary конструктор, то много лишней писанины.

Лучше бы сделали, чтобы в производном record, в таких конструкторах неявно добавлялись параметры из base record.
public record Rec1(int Prop1)
{
}

public record Rec2(int Prop2) : Rec1 // Ошибка. В производном такие конструкторы нельзя. Если в базовом нет без параметров. Лучше бы неявно превращался в конструктор: Rec2(int Prop1, int Prop2)
{
}