Ist es möglich, ein Valuetype zu klonen?
-
05-07-2019 - |
Frage
Ist es möglich, ein Objekt zu klonen, wenn es bekannt ist ein boxed Valuetype sein, ohne zu schreiben typspezifischen Klon-Code?
Einige Code als Referenz
List<ValueType> values = new List<ValueType> {3, DateTime.Now, 23.4M};
DuplicateLastItem(values);
Das partical Problem, das ich habe, ist mit einer Wert Stack-basierten virtuellen Maschine Anweisung. (Und Im zu faul typeof schreiben (int) typeof (Datetime) ....)
Update Ich glaube, ich verwirrt mich (und ein paar andere Leute). Die Arbeitslösung die ich habe ist;
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());
Lösung
Ich weiß nicht, ob ich völlig habe die Frage falsch verstanden.
Sind Sie versuchen, dies zu tun?
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]);
}
Andere Tipps
Jede Zuordnung eines Valuetype per Definition ist ein Klon.
Edit:
Wenn ein Valuetype eine Kopie Ihrer Valuetype Boxen wird in einer Instanz einer Reference enthalten sein.
In Abhängigkeit von der Cloning-Methode, ich voraussehen keine Unterschiede.
Sie können einen Hack Convert.ChangeType
verwenden:
object x = 1;
var type = x.GetType();
var clone = Convert.ChangeType(x, type);
// Make sure it works
Assert.AreNotSame(x, clone);
Das Ergebnis ist Kopie des Wertes in neuem Objekt umrandet.
Warum klonen Sie müssen Code überhaupt? Werttypen sollte in der Regel unveränderlich sein sowieso, und dies wird nicht durch Boxen verändert. Daher ist ein gut gestalteter Werttyp keine Anforderung für das Klonen hat.
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;
}
Auch wenn ich die Notwendigkeit, entweder nicht in Frage, da ein Werttyp sollte unveränderlich sein.
Wenn Sie das Objekt zu Valuetype zu werfen, wäre, dass ein Klon nicht dazu führen werden? Dies könnte dann Umgepackte werden:
int i = 3;
object b = i; // box it
ValueType c = (ValueType) b; // unbox it
object d = c; // box it, effectively creating a clone
Also, ich glaube, ich würde eine effektive Klon-Methode sagen wäre:
object clone = (ValueType) boxed;