Возвращение нового объекта на перегруженных операторах, кажется, единственное, что нужно сделать. Правильно?
- Если у вас есть класс (X), который содержит большой буфер
- Часть буфера содержит содержимое, остальные свободны.
- Вы перегрузили бинарный оператор + для объединения двух объектов (одного типа), создав новый объект, содержащий добавленное содержимое обоих операндов.
Другими словами:
z = x + y // z is a new object containing the appended data from x and y.
Это, очевидно, хорошо, потому что мы не хотим искажать x или y во время операции. Однако спецификации языка C # 7.2.2 говорят:
Когда бинарный оператор перегружен, соответствующий оператор присваивания (если таковой имеется) также неявно перегружен.
это означает, что:
x += y; // will create a new x, copy contents of old x merged with y
// and the old x will be garbage collected at some point
Это больно, потому что может быть гораздо быстрее просто скопировать содержимое y в свободную часть x. Таким образом, мы не копируем большой объект и не оставляем беспорядок для хорошего сборщика мусора.
Я понимаю, что это можно сделать с помощью простого x.Add (y). Мне любопытно, если есть способ сделать это с помощью операторов. например, чтобы выяснить, что мы находимся внутри оператора присваивания и выполнить оптимизированную процедуру.