Почему C # не поддерживает концепцию конструктора копирования? - PullRequest
14 голосов
/ 20 апреля 2010

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

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

Ответы [ 3 ]

28 голосов
/ 20 апреля 2010

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

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

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

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

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

6 голосов
/ 20 апреля 2010

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

2 голосов
/ 20 апреля 2010

Не так ли?

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

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

...