ValueTypeを複製することは可能ですか?
-
05-07-2019 - |
質問
ボックス化された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;
所属していません StackOverflow