質問

ボックス化されたValueTypeであることがわかっている場合、タイプ固有のクローンコードを記述せずにオブジェクトをクローンできますか?

参照用のコード

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

私が抱えている部分的な問題は、値スタックベースの仮想命令マシンです。 (そしてtypeof(int)typeof(DateTime)を書くのが面倒です...)

更新自分(および他の数人)を混乱させたと思います。私が持っている実用的なソリューションは次のとおりです。

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

他のヒント

値型の割り当てはすべて、定義によりクローンです。

編集:

値型をボックス化すると、値型のコピーがReferenceTypeのインスタンスに含まれます。

クローニング方法によっては、違いは見当たりません。

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;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top