亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C#中Clone一個對象的值到另一個對象案例

 更新時間:2020年12月09日 09:55:07   作者:這名字不好聽  
這篇文章主要介紹了C#中Clone一個對象的值到另一個對象案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

我也只是略懂皮毛,自己記錄下方便以后看的,各位有任何高見煩請留言,謝謝,抱拳!

想只復制值需要你的類實現(xiàn)ICloneable接口,并實現(xiàn)public object Clone()方法,其中

{
return this as object; //引用同一個對象
return this.MemberwiseClone(); //淺復制
return new DrawBase() as object;//深復制
}

引用

即相當于用等號(=)賦值,相當于 this,引用,兩者共用一套數(shù)據(jù)

深復制

新建對象,需手動賦值,所有數(shù)據(jù)新建,兩個對象完全無關(guān)

淺復制

只復制值而不要引用,但只作用于基礎(chǔ)類型(int,float,string也好使),對于引用類型(如自建類)不生效。如果只想要值,可在自建類里也是用這種辦法,如a.t = T.Clone() as T; 最后將a返回,即可解決這個問題。

本次主談淺復制,如有形如:

 class a : ICloneable
{
 public int i;
 public string str;
 public b ins;
 
 public object Clone()
 {
 return this.MemberwiseClone(); //淺復制
 }
}
class b
{
 public int bi;
}
 --------------Program--------------
 Main : 
 {
 a t1 = new a();
 t1.i = 1;
 t1.str = "str1";
 t1.ins = new t1();
 t1.ins.bi = 111;
 
 a t2 = t1.Clone() as a;
 print(t1.i + " " + t2.i);
 print(t1.str + " " + t2.str );
 print(t1.ins.bi + " " + t2.ins.bi);
 
 t2.i = 2;
 t2.str = "str2";
 t2.ins.bi = 222;
 print(t1.i + " " + t2.i);
 print(t1.str + " " + t2.str );
 print(t1.ins.bi + " " + t2.ins.bi);
} 

首先這段代碼實際上是不會運行的,因為淺復制不會復制引用,也就是在print(t2.ins.bi)時,實際上t2.ins是空,但t2.i和t2.str是有值的,而且在后續(xù)對t2.i和t2.str進行改動時并不會影響到t1的值,這一部分的結(jié)果使我們想要的。

但實際上類里有屬性是引用是難以避免甚至是很常見的,這種情況我們只需要在類b中也實現(xiàn)ICloneable接口并實現(xiàn)

public object Clone()
{
 return this.MemberwiseClone(); //淺復制
}

同時修改類a中的Clone方法為:

public object Clone()
{
 a T = this.MemberwiseClone() as a; //淺復制
 T.ins = ins.Clone() as b;
 return T;
}

由此,t2將獲取到t1的所有值,且對t2修改時,并不會影響到t1。

補充知識:C++中實現(xiàn)對象的clone()

在C#中,許多對象自動實現(xiàn)了clone函數(shù),在C++中,要拷貝一個對象,除了自定義一個拷貝構(gòu)造函數(shù)來實現(xiàn)對象復制外,還可以像C#中那樣實現(xiàn)一個clone函數(shù),這需要借助編譯器實現(xiàn)的一個隱藏拷貝構(gòu)造函數(shù),這樣的做法,更省心。

#include "stdafx.h"
#include <iostream>

class CA
{
public:
 int value;
 CA* clone() const { return new CA( *this );}
 //僅一個構(gòu)造函數(shù)
 CA(int a ){value=a;} 
};

int _tmain(int argc, _TCHAR* argv[])
{
 CA* objA=new CA(10);
 CA* objtemp=objA->clone();
 delete objA;
 std::cout<<objtemp->value;
 delete objtemp;
 return 0;
}

以上這篇C#中Clone一個對象的值到另一個對象案例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • C# Distinct和重寫IEqualityComparer時要知道的二三事

    C# Distinct和重寫IEqualityComparer時要知道的二三事

    這篇文章主要給大家介紹了關(guān)于C# Distinct和重寫IEqualityComparer時要知道的二三事,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-06-06
  • c# 接口使用實例

    c# 接口使用實例

    這篇文章主要介紹了c#接口使用的實例,文中講解非常細致,代碼幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-07-07
  • C#實現(xiàn)軟件開機自動啟動的兩種常用方法總結(jié)

    C#實現(xiàn)軟件開機自動啟動的兩種常用方法總結(jié)

    這篇文章主要為大家詳細介紹了C#實現(xiàn)軟件開機自動啟動的兩種常用方法,文中的示例代碼講解詳細,具有一定的學習價值,感興趣的小伙伴可以了解一下
    2023-07-07
  • C#隱藏手機號、郵箱等敏感信息的實現(xiàn)方法

    C#隱藏手機號、郵箱等敏感信息的實現(xiàn)方法

    這篇文章主要介紹了C#隱藏手機號、郵箱等敏感信息的實現(xiàn)方法的相關(guān)資料,需要的朋友可以參考下
    2016-09-09
  • Unity3d射箭小游戲?qū)崿F(xiàn)示例

    Unity3d射箭小游戲?qū)崿F(xiàn)示例

    這篇文章主要為大家介紹了Unity3d射箭小游戲?qū)崿F(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • C#鎖住文件的操作步驟

    C#鎖住文件的操作步驟

    在本篇文章里小編給大家整理的是關(guān)于C#鎖住文件的操作步驟以及相關(guān)知識點,需要的朋友們參考下。
    2019-08-08
  • C#登入實例

    C#登入實例

    本篇文章通過截圖的方式向大家展示C#程序登陸實現(xiàn)的全過程,利用了C#三層架構(gòu)的編寫方法,希望對大家今后編寫代碼有所幫助
    2016-11-11
  • C#實現(xiàn)微信紅包功能

    C#實現(xiàn)微信紅包功能

    這篇文章主要介紹了C#實現(xiàn)微信紅包功能,使用正態(tài)分布計算紅包金額,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Unity編輯器資源導入處理函數(shù)OnPostprocessAudio使用案例

    Unity編輯器資源導入處理函數(shù)OnPostprocessAudio使用案例

    這篇文章主要為大家介紹了Unity編輯器資源導入處理函數(shù)OnPostprocessAudio使用案例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • C#常用目錄文件操作類實例

    C#常用目錄文件操作類實例

    這篇文章主要介紹了C#常用目錄文件操作類,實例分析了C#針對目錄的讀取、檢測及查找等相關(guān)操作技巧,非常具有實用價值,需要的朋友可以參考下
    2015-03-03

最新評論