с выражением 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 (с некоторыми изменениями, чтобы заставить ее работать). Вы можете видеть, что он компилируется довольно просто.