目錄C#中的對象深拷貝和淺拷貝概述1. 淺拷貝2. 深拷貝總結引用 C#中的對象深拷貝和淺拷貝 概述 在C#中,對象拷貝是指將一個對象的副本創(chuàng)建到另一個對象中。對象拷貝通常用于數(shù)據(jù)傳輸或創(chuàng)建對象的新實例。 C#中有兩種主要的拷貝方式:淺拷貝和深拷貝 1. 淺拷貝 淺拷貝是指只拷貝對象的值類型成員,而
在C#中,對象拷貝是指將一個對象的副本創(chuàng)建到另一個對象中。對象拷貝通常用于數(shù)據(jù)傳輸或創(chuàng)建對象的新實例。
C#中有兩種主要的拷貝方式:淺拷貝和深拷貝。
淺拷貝是指只拷貝對象的值類型成員,而引用類型成員的引用則保持不變。這意味著新的對象和原始對象將共享所有引用類型成員的實際對象。
實現(xiàn)方式:
this.MemberwiseClone();
示例代碼:
public class Person
{
public Person()
{
this.Address = new Address();
}
public string Name { get; set; }
public int Age { get; set; }
public Address Address { get; set; }
public Person Clone()
{
return (Person)this.MemberwiseClone();
}
}
public class Address
{
public string Street { get; set; }
public string City { get; set; }
}
Person person1 = new Person()
{
Name = "張三",
Address = new Address()
{
City = "北京",
}
};
Person person2 = person1.Clone(); // 淺拷貝
// 修改原對象的屬性
person1.Address.City = "上海";
// 修改副本對象的屬性
person2.Name = "李四";
person2.Address.City = "昆明";
string result = $"原對象{JsonConvert.SerializeObject(person1)}。副本{JsonConvert.SerializeObject(person2)}";
MessageBox.Show($"淺拷貝:原對象和副本修改引用類型屬性后相互影響。{result}");
深拷貝是指不僅拷貝對象的值類型成員,而且還拷貝所有引用類型成員的實際對象。這意味著新的對象將擁有其引用類型成員的完全獨立副本。
實現(xiàn)方式:
反射、序列化、對象映射(三方開源如TinyMapper、AutoMapper)。
示例代碼:
public static void Copy2()
{
Person person1 = new Person()
{
Name = "張三",
Address = new Address()
{
City = "北京",
}
};
Person person2 =person1.MapTo();//深拷貝3對象映射
//修改原對象的屬性
person1.Address.City = "上海";
//修改副本對象的屬性
person2.Name = "李四";
person2.Address.City = "昆明";
string result = $"原對象{JsonConvert.SerializeObject(person1)}。副本{JsonConvert.SerializeObject(person2)}";
MessageBox.Show($"深拷貝:原對象和副本不相互影響。{result}");
}
淺拷貝通常用于數(shù)據(jù)傳輸,因為它是快速且有效的。但是,如果需要避免意外修改原始對象,則應使用深拷貝。
以下是一些有關何時使用淺拷貝和深拷貝的準則:
本站所有軟件,都由網(wǎng)友上傳,如有侵犯你的版權,請發(fā)郵件[email protected]
湘ICP備2022002427號-10 湘公網(wǎng)安備:43070202000427號© 2013~2025 haote.com 好特網(wǎng)