ValueType을 복제 할 수 있습니까?
-
05-07-2019 - |
문제
유형의 특정 클론 코드를 작성하지 않고 박스형 밸류 타입으로 알려진 경우 객체를 복제 할 수 있습니까?
참조를위한 일부 코드
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;
제휴하지 않습니다 StackOverflow