1

this.MemberwiseClone() を使用して浅いコピーを作成していますが、機能していません。以下のコードを見てください。

public class Customer
    {

        public int Id;
        public string Name;

        public Customer CreateShallowCopy()
        {
            return (Customer)this.MemberwiseClone();
        }
    }

class Program
{
    static void Main(string[] args)
    {
        Customer objCustomer = new Customer() { Id = 1, Name = "James"};
        Customer objCustomer2 = objCustomer;

        Customer objCustomerShallowCopy = objCustomer.CreateShallowCopy();

        objCustomer.Name = "Jim";
        objCustomer.Id = 2;            
    }
}

プログラムを実行すると、objCustomerShallowCopy.Name が「Jim」ではなく「James」と表示されます。

何か案は??

4

2 に答える 2

2

Customer オブジェクトを浅いコピーすると、objCustomerShallowCopy.Name は James になり、そのオブジェクトを変更するまでそのままになります。あなたの場合、文字列 "James" はそれへの 3 つの参照 (objCustomer、objCustomer2、および objCustomerShallowCopy) を与えます。

objCustomer.Name を Jim に変更すると、実際には objCustomer オブジェクトの新しい文字列オブジェクトが作成され、"James" 文字列オブジェクトへの 1 つの参照が解放されます。

于 2010-10-10T16:28:46.523 に答える
0

また、それを機能させるのに問題がありました。オブジェクトをシリアライズしてからデシリアライズすることで解決しました。

public static T DeepCopy<T>(T item)
{
    BinaryFormatter formatter = new BinaryFormatter();
    MemoryStream stream = new MemoryStream();
    formatter.Serialize(stream, item);
    stream.Seek(0, SeekOrigin.Begin);
    T result = (T)formatter.Deserialize(stream);
    stream.Close();
    return result;
}

上記のコードを使用すると、2 つのオブジェクト間に参照がなくなります。

于 2010-10-10T16:27:08.397 に答える