.net memberwiseclone мелкая копия не работает - PullRequest
1 голос
/ 10 октября 2010

Я использую 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 как «Джеймс», а не «Джим».

Ответы [ 2 ]

2 голосов
/ 10 октября 2010

Когда вы мелко копируете объект Customer, objCustomerShallowCopy.Name будет James и будет таким, пока вы не измените этот объект.Теперь в вашем случае строка «Джеймс» будет давать 3 ссылки на нее (objCustomer, objCustomer2 и objCustomerShallowCopy).

Когда вы меняете objCustomer.Name на Jim, вы фактически создаете новый строковый объект для объекта objCustomer.и освобождение 1 ссылки для строкового объекта "Джеймс".

0 голосов
/ 10 октября 2010

У нас также были проблемы с тем, чтобы заставить это работать. Мы решили это путем сериализации и десериализации объекта.

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

Используя приведенный выше код, между двумя объектами не будет ссылки.

...