Vra

Is dit moontlik om 'n voorwerp te kloon, wanneer dit bekend as 'n doos Waarde Type wees, sonder tipe skryfwerk spesifieke kloon kode?

Sommige kode vir verwysing

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

Die partical probleem wat ek het is met 'n waarde stapel gebaseer virtuele onderrig masjien. (En Im te lui om typeof skryf (int) typeof (Datum tyd) ....)

update Ek dink ek verwar myself (en 'n paar ander mense). Die werk oplossing wat ek het is;

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());
Was dit nuttig?

Oplossing

Ek weet nie, as ek heeltemal die vraag misverstaan.
Is jy probeer om dit te doen?

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

Ander wenke

Elke opdrag van 'n Waarde Type is per definisie 'n kloon.

Edit:

Wanneer boks 'n Waarde Type 'n afskrif van jou Waarde Type sal vervat word in 'n geval van 'n ReferenceType.

Na gelang van die Kloning metode, Ek het nie verskille voorsien.

Jy kan 'n hak met behulp van Convert.ChangeType gebruik:

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

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

Die resultaat is 'n afskrif van die waarde doos in 'n nuwe voorwerp.

Hoekom het jy nodig kloning kode in elk geval? Waarde tipes moet gewoonlik onveranderlike wees in elk geval, en dit is nie verander deur boks. Dus, 'n goed ontwerpte waarde tipe het geen vereiste vir kloning.

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

Hoewel ek doen bevraagteken die behoefte aan nie, gegewe dat 'n waarde tipe behoort onveranderlike te wees.

As jy die voorwerp werp om Waarde Type, sou dit nie veroorsaak dat 'n kloon te maak? Dit kan dan reboxed:

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

So, ek dink ek sou sê 'n doeltreffende kloon metode sou wees:

object clone = (ValueType) boxed;
Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top