с выражением vs новое ключевое слово - PullRequest
0 голосов
/ 17 июня 2020

Я читал devblogs о «что нового в 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" заставляет вас писать меньше строк ТОЛЬКО без каких-либо утечек памяти?

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

1 Ответ

3 голосов
/ 17 июня 2020

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

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

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

Edit:

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

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