Почему С# не поддерживает концепцию конструктора копирования?

Мне задали этот вопрос в одном из моих интервью, но я не смог выяснить, почему именно этого понятия нет.

Пожалуйста, дай мне знать.


person Amit    schedule 20.04.2010    source источник
comment
Под копией вы подразумеваете глубокую копию, не так ли?   -  person Dan Diplo    schedule 20.04.2010
comment
Вы уверены, что это был не вопрос с подвохом? :)   -  person Tony    schedule 20.04.2010
comment
Я думаю, что фактический вопрос заключается в том, почему нет стандартного. en.wikipedia.org/wiki/Copy_constructor   -  person juharr    schedule 20.04.2010
comment
@Dan Diplo: Deep Copy .... @Tony: Я не думаю, что это сложно. Я сказал ему, что функциональность может быть достигнута с помощью интерфейса IClonable. И он ответил, что да, это может быть, но почему концепции нет с точки зрения дизайна. @Juharr: Может быть....   -  person Amit    schedule 20.04.2010
comment
Отсутствие необходимости в конструкторе копирования является одним из замечательных преимуществ сборщика мусора. Не тратить время на изготовление копий — это хорошо.   -  person Hans Passant    schedule 20.04.2010
comment
@Hans Passant: Какое отношение сборка мусора имеет к копированию объектов? Если я использую интеллектуальные указатели в C++, вдруг мне не понадобится конструктор копирования?   -  person David Thornley    schedule 23.04.2010


Ответы (3)


Он не встроен в язык, потому что нет разумной реализации по умолчанию.

Конструкторы копирования страдают от многих из тех же неясностей, что и клонирование. Например, хотите ли вы сделать поверхностную или глубокую копию, зависит от ваших конкретных обстоятельств.

Скажем, у вас есть класс Order со свойством Customer. Должен ли его конструктор копирования создавать нового клиента или указывать на исходный экземпляр? Наверное оригинальный экземпляр - а как же Order.Payment?

Хуже того, даже когда вы решите выполнить глубокую копию, вы даже не сможете создать все свои подчиненные объекты, потому что их конструкторы (или аналогичные фабричные методы) могут быть недоступны.

Если этого недостаточно, эта статья о проблемах проектирования Java освещает некоторые другие проблемы (например, усечение типа).

person Jeff Sternal    schedule 20.04.2010
comment
+1 за акцент на том, что для встроенного конструктора копирования нет разумного поведения по умолчанию. Точно. - person Paul Turner; 20.04.2010
comment
Кроме того, если он был построен как C++, вы можете получить глубокое клонирование, хотите вы этого или нет: this._PrivateFieldForCustomer = source._PrivateFieldForCustomer; ‹-- вызывает конструктор копирования. - person Lasse V. Karlsen; 21.04.2010
comment
По умолчанию C++ копирует все базовые классы и члены, используя их конструкторы копирования. Это не всегда то, что вы хотите, но я считаю это разумным значением по умолчанию. - person David Thornley; 23.04.2010

Каким образом C# не поддерживает идею конструктора копирования? Вы более чем свободны создать тот, который копирует так глубоко, как вам нравится.

person Adam Robinson    schedule 20.04.2010
comment
+1: С# не имеет неявно определенного конструктора копирования, но это функция С++, которая, возможно, приносит больше вреда, чем пользы, поэтому вы можете сказать, что С# пропустил ее из-за извлеченного урока. - person Sam Harwell; 20.04.2010
comment
Я думаю, зависит от точки зрения - для классов структурного типа он удалил шаблонный код. Почти любая языковая конструкция может быть неправильно использована в чужих руках. А C# выбрасывает совершенно хорошие возможности C++ и Java, которые можно было бы хорошо использовать. Например, локальные неизменяемые локальные переменные, которых по какой-то странной причине нет в C#, несмотря на появление функциональных языков, и это действительно простая функция для реализации. Ну что ж. - person Doug; 13.08.2015
comment
@SamHarwell [намного более поздний комментарий] Я совершенно не согласен с тем, что c++ copy ctor приносит больше вреда, чем пользы, если вы знаете, что означает создание копии в C++, и как работает система типов C++ в целом. Также из С++ 11 есть семантика перемещения, которая позволяет, позвольте мне сказать, копировать другой тип. - person user1832484; 11.04.2020

Не так ли?

class Foo
{
   public Foo (Foo other)   // copy ctor
   { ... }
}

Но, возможно, я немного подзабыл, какие другие правила применяются в C++ (где был придуман термин копирующий конструктор).

person Henk Holterman    schedule 20.04.2010
comment
В C++ (по крайней мере, в C++11) вы можете по умолчанию использовать конструктор копирования следующим образом: Foo(Foo other) = default;, который обычно по умолчанию вызывает все конструкторы копирования полей (или присваивания для примитивных типов, таких как int, плавающие и указатели). Если для поля не существует конструктора копирования, компилятор с треском провалится. - person Doug; 13.08.2015