您的位置:首頁 > 軟件教程 > 教程 > 深淺拷貝在C#中的應(yīng)用

深淺拷貝在C#中的應(yīng)用

來源:好特整理 | 時(shí)間:2024-05-10 08:49:43 | 閱讀:103 |  標(biāo)簽: 對象 C 應(yīng)用   | 分享到:

目錄C#中的對象深拷貝和淺拷貝概述1. 淺拷貝2. 深拷貝總結(jié)引用 C#中的對象深拷貝和淺拷貝 概述 在C#中,對象拷貝是指將一個(gè)對象的副本創(chuàng)建到另一個(gè)對象中。對象拷貝通常用于數(shù)據(jù)傳輸或創(chuàng)建對象的新實(shí)例。 C#中有兩種主要的拷貝方式:淺拷貝和深拷貝 1. 淺拷貝 淺拷貝是指只拷貝對象的值類型成員,而

在C#中,對象拷貝是指將一個(gè)對象的副本創(chuàng)建到另一個(gè)對象中。對象拷貝通常用于數(shù)據(jù)傳輸或創(chuàng)建對象的新實(shí)例。

C#中有兩種主要的拷貝方式:淺拷貝和深拷貝。

淺拷貝

淺拷貝是指只拷貝對象的值類型成員,而引用類型成員的引用則保持不變。這意味著新的對象和原始對象將共享所有引用類型成員的實(shí)際對象。

實(shí)現(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}");

深拷貝

深拷貝是指不僅拷貝對象的值類型成員,而且還拷貝所有引用類型成員的實(shí)際對象。這意味著新的對象將擁有其引用類型成員的完全獨(dú)立副本。

實(shí)現(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}");
}

總結(jié)

淺拷貝通常用于數(shù)據(jù)傳輸,因?yàn)樗强焖偾矣行У。但是,如果需要避免意外修改原始對象,則應(yīng)使用深拷貝。

以下是一些有關(guān)何時(shí)使用淺拷貝和深拷貝的準(zhǔn)則:

  • 使用淺拷貝:
    • 當(dāng)需要快速創(chuàng)建對象副本時(shí)
    • 當(dāng)原始對象不可變時(shí)
    • 當(dāng)原始對象和副本不會(huì)同時(shí)使用時(shí)
  • 使用深拷貝:
    • 當(dāng)需要避免意外修改原始對象時(shí)
    • 當(dāng)原始對象和副本需要同時(shí)使用時(shí)
    • 當(dāng)原始對象包含引用類型成員時(shí)

引用

小編推薦閱讀

好特網(wǎng)發(fā)布此文僅為傳遞信息,不代表好特網(wǎng)認(rèn)同期限觀點(diǎn)或證實(shí)其描述。

相關(guān)視頻攻略

更多

掃二維碼進(jìn)入好特網(wǎng)手機(jī)版本!

掃二維碼進(jìn)入好特網(wǎng)微信公眾號!

本站所有軟件,都由網(wǎng)友上傳,如有侵犯你的版權(quán),請發(fā)郵件[email protected]

湘ICP備2022002427號-10 湘公網(wǎng)安備:43070202000427號© 2013~2025 haote.com 好特網(wǎng)