Domanda

È possibile clonare un oggetto, quando è noto che è un ValueType inscatolato, senza scrivere un codice clone specifico per tipo?

Alcuni codici di riferimento

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

Il problema parziale che ho è con una macchina di istruzioni virtuale basata su stack di valore. (E sono troppo pigro per scrivere typeof (int) typeof (DateTime) ....)

Aggiorna Penso di aver confuso me stesso (e poche altre persone). La soluzione di lavoro che ho è;

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());
È stato utile?

Soluzione

Non lo so, se ho completamente frainteso la domanda.
Stai cercando di farlo?

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

Altri suggerimenti

Ogni assegnazione di un tipo di valore è per definizione un clone.

Modifica:

Quando inscatoli un tipo di valore, una copia del tuo tipo di valore sarà contenuta in un'istanza di un Tipo di riferimento.

A seconda del metodo di clonazione, non prevedo alcuna differenza.

Puoi usare un hack usando Convert.ChangeType :

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

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

Il risultato è una copia del valore racchiuso in un nuovo oggetto.

Perché hai bisogno del codice di clonazione comunque? I tipi di valore dovrebbero generalmente essere immutabili comunque e questo non è cambiato dal pugilato. Pertanto, un tipo di valore ben progettato non richiede requisiti per la clonazione.

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

Anche se metto in dubbio la necessità di entrambi, dato che un tipo di valore dovrebbe essere immutabile.

Se dovessi trasmettere l'oggetto a ValueType, ciò non provocherebbe la creazione di un clone? Questo potrebbe quindi essere riordinato:

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

Quindi, penso che direi che una metodologia clone efficace sarebbe:

object clone = (ValueType) boxed;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top