從克隆的對象分配我還該dot net Fiddle對象複製時未更新/在C#
using System;
using Newtonsoft.Json;
public class Program
{
public static void Main()
{
ObjectA objectA = new ObjectA();
objectA.Id = 99;
objectA.Name = "Joe King";
Console.WriteLine("BEFORE");
Console.WriteLine(objectA.Id.ToString() + "|" + objectA.Name);
ObjectB objectB = new ObjectB(objectA);
objectB.DoSomething();
Console.WriteLine("AFTER");
Console.WriteLine(objectA.Id.ToString() + "|" + objectA.Name);
}
}
public class ObjectB
{
ObjectA _objA = null;
ObjectA _objACopy = null;
public ObjectB(ObjectA objA)
{
_objA = objA;
_objACopy = Object.Clone<ObjectA>(objA);
}
public void DoSomething()
{
_objA.Id = 100;
_objA.Name = "Bob Smith";
}
}
public class ObjectA
{
public int Id {get;set;}
public string Name {get;set;}
}
public class Object
{
public static T Clone<T>(T source)
{
var serialized = JsonConvert.SerializeObject(source);
return JsonConvert.DeserializeObject<T>(serialized);
}
}
這給我下面的結果,這是正確的也是下面的代碼。
前
99 |喬金
後
100 |鮑勃·史密斯
但是,如果我想撤消原來的對象上的變化,我改變了我的方法DoSomething的( )到此(這是Fiddle)
public void DoSomething()
{
_objA.Id = 100;
_objA.Name = "Bob Smith";
_objA = _objACopy;
}
但結果是錯誤的;
前
99 |喬金
後
100 |鮑勃·史密斯
正確的結果應該是如下;
前
99 |喬金
後
99 |喬金
所以通過分配對象到對象不工作,但如果我分配給每個個人的財產像這樣,它確實有效(這是Fiddle)
public void DoSomething()
{
_objA.Id = 100;
_objA.Name = "Bob Smith";
_objA.Id = _objACopy.Id;
_objA.Name = _objACopy.Name;
}
有人可以幫助我瞭解什麼是錯誤的,爲什麼我可以打電話
_objA = _objACopy;
返回到原始對象。
我真的很困惑。你爲什麼要複製修改原件? –
這個例子來自一個更大的項目。基本上這個對象被傳入一個Winform(表單)。如果用戶進行了更改,並且想要撤消它們,我可以將它們還原。這就是爲什麼我要這樣展示,以幫助解釋我遇到的問題 – Tommassiov
@ Tommo1977我不認爲這是一種撤消功能的好方法。你是否考慮過不可變的對象和堆棧? –