Question

Est-il possible de cloner un objet lorsqu'il est connu comme étant un ValueType en boîte, sans écrire de code de clone spécifique au type?

Certains codes de référence

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

Le problème que je rencontre concerne une machine d’instruction virtuelle basée sur une pile de valeurs. (Et je suis trop paresseux pour écrire typeof (int) typeof (DateTime) ....)

mise à jour Je pense m'être trompé (avec quelques autres personnes). La solution de travail que j’ai, c’est:

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());
Était-ce utile?

La solution

Je ne sais pas si j'ai totalement mal compris la question.
Est-ce que vous essayez de faire cela?

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]);
}

Autres conseils

Chaque affectation d'un type de valeur est par définition un clone.

Modifier:

Lorsque vous boxez un type de valeur, une copie de votre type de valeur sera contenue dans une instance d'un type ReferenceType.

En fonction de la méthode de clonage, je ne prévois aucune différence.

Vous pouvez utiliser un hack en utilisant Convert.ChangeType :

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

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

Le résultat est une copie de la valeur encadrée dans un nouvel objet.

Pourquoi avez-vous besoin d’un code de clonage? Les types de valeur devraient être généralement immuables de toute façon et cela n’est pas modifié par la boxe. Par conséquent, un type de valeur bien conçu ne nécessite pas de clonage.

    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;
    }

Bien que je mette en doute le besoin de l’un ou de l’autre, étant donné qu’un type de valeur doit être immuable.

Si vous deviez convertir l'objet en ValueType, un clone ne serait-il pas créé? Cela pourrait alors être reboxé:

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

Donc, je pense que je dirais une méthodologie de clonage efficace serait:

object clone = (ValueType) boxed;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top