2009-03-04 7 views
1

일부 클래스에 대해 새 객체를 만들고 싶다면 이미 가지고있는 경우 clone()을 사용하거나 새 키워드를 사용하여 인스턴스화해야합니까?새로운 키워드로 clone() 또는 인스턴스화의 성능이 향상되었습니다.

예, clone()에도 모든 멤버가 복사되지만, 중요하지 않은 경우에 대해 궁금합니다. 나는 시간에 거대한 얻을 실제로 UI에 사용되기 전에 'N'계층을 통해 전달되는 일반적인 목록 (목록 < T >), 함께 일하고으로

ClassType foo = new ClassType(); 
ClassType bar = new ClassType(); // here, will foo.clone() be better choice? 

나는 나의 현재 작업 중 하나로이 필요 (둘 사이에 배열로 변환되어 직렬화 목적으로 나열됩니다.) 그래서 저는 성능 향상을 위해 노력하고있었습니다.

+0

분명치 않다. IList를 복제하고 있습니까? ? 또는 일부 일반 C# 형식? –

+0

일반 목록을 복제하지 않고 목록에 내 개체를 추가하고 있습니다. 그게 내 질문의 핵심이야. –

+0

그리고 얕은 또는 깊은 클론을 원하십니까? (http://msdn.microsoft.com/en-us/library/system.icloneable.clone.aspx) –

답변

5

조숙 한 최적화를하는 것처럼 들립니다. 프로필, 그리고 당신은 일반적으로 시간이 가고있다 놀랄 것입니다. 귀하의 "복제본"이 직렬화를 사용하지 않는 한, 그것이 여기에 있을지는 의문입니다.

그건 그렇고; ICloneable.Clone()은 정의가 잘못되어 (딥 대 얕은) 드물게 지원되기 때문에 피할 가치가 있습니다. 대부분의 경우 Clone() 구현은 new(); // now copy properties을 수행하거나 직렬화를 사용합니다.

1

. 클론 속도가 확실히 느립니다.

7

Clone() 어쨌든 new을 수행 할 것입니다.

Clone()을 호출하면 어쨌든 새로운 참조가 생성되며 모든 구성원이 복사되므로 꼭 느려질 것입니다.

1

복제본이 백그라운드에서 개체를 새로 추가해야하고 일반 복제 작업을 수행해야하기 때문에 새로운 것을 상상해보십시오.

항상 그렇듯이 의심 스럽다면 프로필!

2

clone은 새 객체를 할당해야합니다 (즉, new 어딘가에 호출해야 함). 따라서 더 잘 수행 할 수 없습니다. 다시 말해, new perforamance는 clone 성능의 하한입니다.

1

이것은 생성자에서 수행되는 작업의 양에 따라 달라집니다. Clone()은 모든 멤버 값을 첫 번째 클래스에서 두 번째 클래스로 복사합니다. 귀하의 생성자가 그 이상, 또는 그 이하의 일을합니까? 그 대답은 당신에게 말해야합니다.

3

클로닝은 원래와 관련이없는 (즉, 심벌 대 얕은 즉 지뢰밭) 객체를 생성하기위한 것이고, 새로운 것과 다른 목적은 관련없는 클래스 인스턴스를 인스턴스화하는 것입니다.

요약 : 서로 다른 용도로 사용되며 상호 교환 할 수 없습니다.

+0

네, 맞습니다. –

관련 문제