문제

유형의 특정 클론 코드를 작성하지 않고 박스형 밸류 타입으로 알려진 경우 객체를 복제 할 수 있습니까?

참조를위한 일부 코드

List<ValueType> values = new List<ValueType> {3, DateTime.Now, 23.4M};
DuplicateLastItem(values);

내가 가진 부분적인 문제는 값 스택 기반 가상 명령기와 관련이 있습니다. (그리고 typeof (int) typeof (dateTime)를 작성하기에는 너무 게으른 Im입니다 ....)

업데이트 나는 나 자신 (그리고 다른 몇몇 사람들)을 혼란스럽게했다고 생각합니다. 내가 가진 작동 솔루션은 다음과 같습니다.

List<ValueType> values = new List<ValueType> { 3, DateTime.Now, 23.4M }; 

// Clone
values.Add(values[values.Count() - 1]);

// Overwrite original
values[2] = 'p';

foreach (ValueType val in values)
   Console.WriteLine(val.ToString());
도움이 되었습니까?

해결책

질문을 완전히 오해했다면 모르겠습니다.
당신은 이것을하려고합니까?

public static void Main()
{
    List<ValueType> values = new List<ValueType> {3, DateTime.Now, 23.4M};
    DuplicateLastItem(values);

    Console.WriteLine(values[2]);
    Console.WriteLine(values[3]);
    values[3] = 20;
    Console.WriteLine(values[2]);
    Console.WriteLine(values[3]);
}

static void DuplicateLastItem(List<ValueType> values2)
{
    values2.Add(values2[values2.Count - 1]);
}

다른 팁

ValueType의 모든 할당은 정의상 클론입니다.

편집하다:

ValueType을 복싱하면 ValueType 사본이 참조 장치 인스턴스에 포함됩니다.

복제 방법에 따라 차이를 예측하지 않습니다.

해킹을 사용할 수 있습니다 Convert.ChangeType:

object x = 1;
var type = x.GetType();
var clone = Convert.ChangeType(x, type);

// Make sure it works
Assert.AreNotSame(x, clone);

결과는 새 개체에 박스가 된 값의 사본입니다.

어쨌든 복제 코드가 필요한 이유는 무엇입니까? 가치 유형 ~해야 한다 일반적으로 어쨌든 불변이 아니며 권투에 의해 변경되지 않습니다. 따라서 잘 설계된 값 유형은 클로닝에 대한 요구 사항이 없습니다.

    private static T CloneUnboxed<T>(object o) where T : struct
    {
        return (T)o;
    }

    private static object CloneBoxed<T>(object o) where T : struct
    {
        return (object)(T)o;
    }

비록 가치 유형이 불변이되어야한다는 점을 감안할 때 어느 쪽이든 의문을 제기합니다.

ValueType에 물체를 캐스팅한다면 복제가 만들어지지 않습니까? 그런 다음 다시 복귀 할 수 있습니다.

int i = 3;
object b = i; // box it
ValueType c = (ValueType) b; // unbox it
object d = c; // box it, effectively creating a clone

따라서 효과적인 복제 방법론은 다음과 같습니다.

object clone = (ValueType) boxed;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top