在C#中創(chuàng)建對象的副本請看下面的代碼(摘自C#書):public class MyClass {
public int val;}public struct myStruct
{
public int val;}public class Program {
private static void Main(string[] args)
{
MyClass objectA = new MyClass();
MyClass objectB = objectA;
objectA.val = 10;
objectB.val = 20;
myStruct structA = new myStruct();
myStruct structB = structA;
structA.val = 30;
structB.val = 40;
Console.WriteLine("objectA.val = {0}", objectA.val);
Console.WriteLine("objectB.val = {0}", objectB.val);
Console.WriteLine("structA.val = {0}", structA.val);
Console.WriteLine("structB.val = {0}", structB.val);
Console.ReadKey();
}}我知道它會產(chǎn)生以下輸出:objectA.val = 20objectB.val = 20structA.val = 30structB.val = 40輸出的最后兩行我沒有問題,但前兩個告訴我objectA并objectB指向相同的內(nèi)存塊(因為在C#中,對象是引用類型)。問題是make如何制作objectB,objectA以便它指向內(nèi)存中的不同區(qū)域。我理解,嘗試分配他們的成員可能不起作用,因為這些成員也可能是參考。那么我該如何制作objectB一個完全不同的實體objectA呢?謝謝
3 回答

牧羊人nacy
TA貢獻1862條經(jīng)驗 獲得超7個贊
沒有內(nèi)置的方式。你可以讓MyClass實現(xiàn)IClonable
接口(但它有點不贊成)或只是編寫自己的Copy / Clone方法。在任何一種情況下,您都必須編寫一些代碼。
對于大對象,您可以考慮序列化+反序列化(通過MemoryStream),只是為了重用現(xiàn)有代碼。
無論采用何種方法,都要仔細考慮“副本”的含義。它應(yīng)該有多深,是否有被禁止的Id字段等。

慕的地8271018
TA貢獻1796條經(jīng)驗 獲得超4個贊
最簡單的方法是在MyClass類中編寫一個復(fù)制構(gòu)造函數(shù)。
像這樣的東西:
namespace Example{ class MyClass { public int val; public MyClass() { } public MyClass(MyClass other) { val = other.val; } }}
第二個構(gòu)造函數(shù)只接受他自己類型的參數(shù)(您要復(fù)制的參數(shù))并創(chuàng)建一個分配了相同值的新對象
class Program{ static void Main(string[] args) { MyClass objectA = new MyClass(); MyClass objectB = new MyClass(objectA); objectA.val = 10; objectB.val = 20; Console.WriteLine("objectA.val = {0}", objectA.val); Console.WriteLine("objectB.val = {0}", objectB.val); Console.ReadKey(); }}
輸出:
objectA.val = 10objectB.val = 20
- 3 回答
- 0 關(guān)注
- 902 瀏覽
添加回答
舉報
0/150
提交
取消