C#中實現對象的深拷貝

来源:https://www.cnblogs.com/heheblog/archive/2018/07/16/net_study_20180716.html
-Advertisement-
Play Games

深度拷貝指的是將一個引用類型(包含該類型里的引用類型)拷貝一份(在記憶體中完完全全是兩個對象,沒有任何引用關係).......... 直接上代碼: 1 /// <summary> 2 /// 對象的深度拷貝(序列化的方式) 3 /// </summary> 4 public static class ...


深度拷貝指的是將一個引用類型(包含該類型里的引用類型)拷貝一份(在記憶體中完完全全是兩個對象,沒有任何引用關係)..........  直接上代碼:

 1     /// <summary>
 2     /// 對象的深度拷貝(序列化的方式)
 3     /// </summary>
 4     public static class MyDeepCopy
 5     {
 6 
 7         /// <summary>
 8         /// xml序列化的方式實現深拷貝
 9         /// </summary>
10         /// <typeparam name="T"></typeparam>
11         /// <param name="t"></param>
12         /// <returns></returns>
13         public static T XmlDeepCopy<T>(T t)
14         {
15             //創建Xml序列化對象
16             XmlSerializer xml = new XmlSerializer(typeof(T));
17             using (MemoryStream ms = new MemoryStream())//創建記憶體流
18             {
19                 //將對象序列化到記憶體中
20                 xml.Serialize(ms, t);
21                 ms.Position = default;//將記憶體流的位置設為0
22                 return (T)xml.Deserialize(ms);//繼續反序列化
23             }
24         }
25 
26         /// <summary>
27         /// 二進位序列化的方式進行深拷貝
28         /// 確保需要拷貝的類里的所有成員已經標記為 [Serializable] 如果沒有加該特性特報錯
29         /// </summary>
30         /// <typeparam name="T"></typeparam>
31         /// <param name="t"></param>
32         /// <returns></returns>
33         public static T BinaryDeepCopy<T>(T t)
34         {
35             //創建二進位序列化對象
36             BinaryFormatter bf = new BinaryFormatter();
37             using (MemoryStream ms = new MemoryStream())//創建記憶體流
38             {
39                 //將對象序列化到記憶體中
40                 bf.Serialize(ms, t);
41                 ms.Position = default;//將記憶體流的位置設為0
42                 return (T)bf.Deserialize(ms);//繼續反序列化
43             }
44         }
45     }
View Code

淺拷貝指的是將該類型裡面的值類型拷貝,而該類型里的引用類型不進行拷貝,實現淺拷貝很簡單,再該類里編寫一個方法,方法內部調用自身的MemberwiseClone()方法即可得到一個object類型的對象,將它強轉成當前對象返回即可,列如:

 1     public class Person
 2     {
 3         public int ID { get; set; }
 4         public string Name { get; set; }
 5         public string Email { get; set; }
 6         public Cat Cat { get; set; }
 7 
 8         /// <summary>
 9         /// Person類的淺拷貝
10         /// </summary>
11         /// <returns></returns>
12         public Person QainClone()
13         {
14             //調用自帶的淺拷貝方法得到的是一個objec類型的對象,然後強轉直接返回就可以了
15             return MemberwiseClone() as Person;
16         }
17     }
View Code

string是個列外


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在程式運行過程中,如果JVM檢測出一個不可能執行的操作,就會出現運行時錯誤。 在Java中,運行時錯誤會作為異常拋出。異常就是一個對象,表示阻止正常進行程式執行的錯誤或者情況。如果異常沒有被處理,那麼程式將會非正常終止。 異常是從方法拋出的。方法的調用者可以捕獲以及處理該異常。 throw語句的執行 ...
  • 題目描述 Description 小 B 最近迷上了華容道,可是他總是要花很長的時間才能完成一次。於是,他想到用編程來完成華容道:給定一種局面,華容道是否根本就無法完成,如果能完成,最少需要多少時間。 小 B 玩的華容道與經典的華容道游戲略有不同,游戲規則是這樣的: 在一個 n*m 棋盤上有 n*m ...
  • Description 給定一些數,求這些數中兩個數的異或值最大的那個值 Input 多組數據。第一行為數字個數n,1 <= n <= 10 ^ 5。接下來n行每行一個32位有符號非負整數。 Output 任意兩數最大異或值 Sample Input 3 3 7 9 Sample Output 14 ...
  • 我的是win10系統,其他系統也差不多,相信你能找到環境配置頁面。 1. 添加JAVA_HOME,值為jdk的路徑,如C:\Program Files\Java\jdk1.8.0_171,你要換成自己的路徑。那麼 JAVA_HOME是什麼意思,它就是一個變數。跟Java里的變數是一樣的意思,後面用的 ...
  • Scala概述 什麼是Scala Scala是一種多範式的編程語言,其設計的初衷是要集成面向對象編程和函數式編程的各種特性。Scala運行於Java平臺(Java虛擬機),並相容現有的Java程式。http://www.scala-lang.org 為什麼要學Scala 1、優雅:這是框架設計師第一 ...
  • 搜索引擎原理 通過搜索引擎進行數據查詢時,搜索引擎並不是直接在資料庫中進行查詢,而是搜索引擎會對資料庫中的數據進行一遍預處理,單獨建立起一份索引結構數據。 我們可以將索引結構數據想象成是字典書籍的索引檢索頁,裡面包含了關鍵詞與詞條的對應關係,並記錄詞條的位置。 我們在通過搜索引擎搜索時,搜索引擎將關 ...
  • 0.更新源 sudo apt-get update 1.安裝依賴 sudo apt-get install curl libunwind8 gettext 2.下載 SDK 或者 RunTime https://www.microsoft.com/net/download/linux curl -s ...
  • 詳情請看《Dotnet core結合jquery的前後端加密解密密碼密文傳輸的實現》,正常來講,這個博客裡面的代碼是沒有問題的,但是我有時候卻會直接報錯,原因是後臺解密失敗:Internal.Cryptography.CryptoThrowHelper.WindowsCryptographicExc ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...