C 中完美轉殖引用型別的物件

2021-05-05 04:51:58 字數 1202 閱讀 2984

我們都知道,在c#中,對於複雜物件,每宣告乙個牸型別的變數a,並用個該型別的物件a給這個變數賦值的時候,其實是讓這個變數a指向了物件a,在記憶體中並沒有多生成乙個物件a的例項.所以不管我們宣告多少個等於a的變數,其實際上永遠都只有乙個a存在於記憶體中.這就是我們常說的引用型別的特性.

引用型別的這一特性的好處是不言無喻的,然而,它也給我們帶了一小點不便,那就是有時候,偶爾我們需要在記憶體中有兩個所有屬性值都一模一樣的物件a和b,這樣便於對b做操作而不影響到a.有人說那new兩次不就有兩個一模一樣的物件了嗎,其實,他沒有考慮到在實際的操作過程中,物件a可能因為使用者的操作,一些屬性被改變了.new出來的物件只能確保初始狀態型別和屬性的一致性,對於執行時改變的屬性它就無能為力了.也就是說,此時,我們得轉殖乙個a物件,把當前a物件的所有屬性值取到新物件中去,這樣就能保證當前兩個物件的一致性.看**吧:

/// /// 轉殖乙個物件

///

/// ///

private object cloneobject(object o)

}return p;

}

呼叫**生成新的一模一樣的物件就很方便了,示例:

textbox t =(textbox)cloneobject(textbox1);

當然,在實際使用的過程中,我發現上面的方法也是有缺陷的,比如在轉殖datagridview物件的時候,setvalue的時候會報錯,其中的原因還有待分析.不過我們還有更專業的轉殖datagridview的方法:
/// /// 專門轉殖datagridview的方法

///

/// ///

public static

datagridview clonedatagridview(datagridview dgv)

else

}foreach (datagridviewrow var in dgv.rows)

if (var.index % 2 == 0)

dtgvr.defaultcellstyle.backcolor = resultdgv.rowsdefaultcellstyle.backcolor;

resultdgv.rows.add(dtgvr);

}return resultdgv;

}catch (exception ex)

return null;

}

現在就沒有遺憾了.

C List引用型別的轉殖

有時候我們想轉殖乙個list去做別的事,而不影響原來的list,我們直接在list後面加上小點點,發現並沒有clone這樣的擴充套件函式。這時候就只有自己擴充套件了。嘗試了三種方式,測試都通過了,至於效能方面我還沒有做測試。一 反射 1 public static listclone this li...

java 引用資料型別實現 物件的轉殖

對建立的bean檔案實現cloneable介面 public class user implements cloneable public string getid public void setid string id public string getuname public void setu...

C 物件比較 值型別 引用型別

region 引用物件比較 引用物件比較 public static bool compareobject object obja,object objb else if obja dbnull.value objb dbnull.value else if obja dbnull.value ob...