с выражением vs новое ключевое слово

Я читал блоги разработчиков о том, "что нового в C#9.0", а потом заметил "с выражением".

public data class Person
{
    public string FirstName { get; init; }
    public string LastName { get; init; }
}
var otherPerson = person with { LastName = "Hanselman" };

они говорят

Запись неявно определяет защищенный "конструктор копирования" - конструктор, который берет существующий объект записи и копирует его поле за полем в новый:

protected Person(Person original) { /* copy all the fields */ } // generated

Выражение with вызывает вызов конструктора копирования, а затем применяет инициализатор объекта сверху, чтобы соответствующим образом изменить свойства.

Мой вопрос: копирует ли "с" все старые объекты из "Кучи", а затем изменяет их новыми значениями (если они существуют), а затем создает новый экземпляр? (IMO... Я думаю, что это дорогой подход) или "with" заставляет вас писать меньше строк ТОЛЬКО без каких-либо утечек памяти?

если бы мое первое предположение было верным, было бы лучше использовать "с" или "новый", например: var obj = new foo();

1 ответ

Решение

А with Expression создает новый экземпляр, поэтому старый экземпляр будет по-прежнему существовать без изменений, в нем не происходит изменений - это имеет смысл, учитывая, что намерение предназначено для работы с неизменяемыми данными.

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

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

Редактировать:

Вот декомпиляция SharpLab (с некоторыми изменениями, чтобы заставить ее работать). Вы можете видеть, что он компилируется довольно просто.

Другие вопросы по тегам