2010-04-20 3 views
12

Меня задавали этот вопрос в одном из моих интервью, но я не смог точно узнать, почему этого понятия нет.Почему C# не поддерживает концепцию Copy Constructor?

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

+0

Под «копией» вы имеете в виду «глубокую копию», не так ли? –

+0

Вы уверены, что это был не трюк? :) – Tony

+2

Я думаю, что фактический вопрос заключается в том, почему нет дефолтного. http://en.wikipedia.org/wiki/Copy_constructor – juharr

ответ

2

Не так ли?

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

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

+0

В C++ (по крайней мере, на C++ 11) вы можете по умолчанию создать конструктор копирования следующим образом: «Foo (Foo other) = default;», который обычно по умолчанию вызывает вызовы всех конструкторов копирования полей (или назначений для примитивных типов как int, float и указатели). Если для поля не существует конструктора копий, компилятор будет бомбить с несчастью. – Doug

6

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

+4

+1: C# не имеет неявно определенного конструктора копирования, но это функция C++, которая, возможно, приносит больше вреда, чем пользы, поэтому вы можете сказать, что C# оставил ее из-за извлеченного урока. –

+0

Зависит от точки зрения, я думаю - для классов типа struct он удалил код котельной плиты. Практически любая конструкция языка может быть неправильно использована в неправильных руках. И C# выбрасывает отличные возможности C++ и Java, которые могут быть использованы хорошо. Подобно локальным неизменяемым локальным переменным, которые по какой-то причине не на C#, несмотря на рост функциональных языков, и это очень простая функция для реализации. Ну что ж. – Doug

28

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

Копировальные конструкции suffer from many of the same ambiguities as cloning. Например, хотите ли вы сделать мелкую копию или глубокую копию, зависит от ваших конкретных обстоятельств.

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

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

В случае, если этого недостаточно, this article on Java Design Issues выделяет некоторые другие проблемы (например, усечение типа).

+2

+1 для акцента на отсутствие разумного поведения по умолчанию для встроенного конструктора копирования. Пятно на. –

+2

Кроме того, если он был построен как C++, вы можете получить глубокое клонирование, хотите ли вы этого или нет: this._PrivateFieldForCustomer = source._PrivateFieldForCustomer; <- вызывает конструктор копирования. –

+2

По умолчанию C++ копирует все базовые классы и члены, используя их конструкторы копирования. Это не всегда то, что вы хотите, но я считаю это разумным дефолтом. –