国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > 綜合 > 正文

C#中的類型相等與恒等(Equality & Identity)

2024-07-21 02:28:47
字體:
供稿:網(wǎng)友

clr提供了可以區(qū)分類型的equality 和identity能力。

l  equality:如果兩個對象是相同的類型,并且它們各自帶有相同和等值的屬性。(they are instances of the same type and if each of the fields in one object matches the values of the fields in the other object)
equality必須滿足三個必要條件:reflexive, symmetrics, and transitive
reflexive: 自身相等,及a==a 是永遠成立的;
symmetrics: 對象性,及a==b成立那么b==a 也成立;
transitive: 傳遞性,及a==b, b==c成立那么a==c 也成立。

l  identity:兩個對象必須相等(意味著他們共享同一塊內(nèi)存區(qū)域)(the two objects have the same values. – two objects are identical if they share an address in memory)

clr提供了至少四種方法來判斷兩個對象的等價性:

1.      public static bool referenceequals(object left, object right);

2.      public static bool equals(object left, object right);

3.      public virtual bool equals(object right);

4.      public static bool operator==(myclass left, myclass right);

referenceequals方法總是用來判斷兩個對象的identity的,不管是針對值類型還是引用類型。所以針對值類型,調(diào)用該方法總是會返回false,因為值類型作為這個方法的參數(shù)時會進行裝箱操作。

靜態(tài)的equals方法提供了判斷兩個對象的equality能力,在其實現(xiàn)的內(nèi)部,調(diào)用了上述第三個虛擬的equals方法。和referenceequals一樣,它們已經(jīng)具備從底層判斷兩個對象的能力,我們從來不會覆寫這兩個方法。

實例equals方法也是用來區(qū)分兩個對象的equality的。

l  對于引用類型的對象,它和referenceequals方法幾乎是一樣的。(因為判斷兩個引用類型是否的equality往往從identity上就可以區(qū)分)

l  而值類型的對象,我們不僅要判斷他們具有相同的對象類型,還要判斷他們的值相等。值類型從system.valuetype繼承而來,valuetype已經(jīng)重寫了object.equals()方法,本來已經(jīng)可以用來滿足這些要求的。但是valuetype.equals()方法不是很有效,因為它必須要通過反射,在不知道具體的派生類型中,完成對它們所含有成員變量的值的比較。因此,建議在我們實現(xiàn)一個值類型的數(shù)據(jù)結(jié)構(gòu)時,同時重寫valuetype.equals()方法。

l  然而我們再回頭看看引用類型,有時兩個引用類型的對象往往被用來進行類似值類型的比較,比如:string類型,它雖然是引用類型,但它也重寫了equals方法,因為我們拿它來判斷兩個string是否相同(equality),實際是希望判斷它們是否具有相同的內(nèi)容,這是一個value semantics。因此,我們建議在考慮實現(xiàn)一個用作值語義環(huán)境下的引用類型時候,也重寫基類的object.equals()方法。

注:請參考mdsn或其它相關(guān)文檔,如何實現(xiàn)equals方法的重寫。

上面的圖示給了很好的例子來區(qū)分equals和referenceequals方法,被用來做equility和identity判斷的區(qū)別。

==運算符是可由類重載的運算符,它也是用來判斷恒等的。
對于未重載==的引用類型,會比較兩個引用類型是否引用同一個對象。這跟引用類型的equals()方法是一樣的。

對于未重載==的值類型,該運算符會比較這兩個值是否"按位"相等,即是否這兩個值中的每個字段都相等。和equals方法一樣,推薦在自定義值類型中,也要重載==運算符,因為也存在反射在效率上的影響。

==運算符和equals方法的區(qū)別在于多態(tài)表現(xiàn)上。equals方法是重寫,而==運算符是被重載。這意味著除非編譯器知道調(diào)用具體的重載版本,否則它只是調(diào)用未重載的==版本。


參考資料:
《essential .net, volume 1: the common language》 by donbox, chris sells
《applied microsoft .net framework programming》by jeffrey richter

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 馆陶县| 泾阳县| 弥渡县| 穆棱市| 天祝| 当雄县| 阿鲁科尔沁旗| 左权县| 彭州市| 定西市| 法库县| 陕西省| 扬州市| 嘉祥县| 桂东县| 中山市| 晋城| 普安县| 襄垣县| 扶沟县| 岳阳市| 舞钢市| 雅江县| 彩票| 梁山县| 休宁县| 贵阳市| 安塞县| 双流县| 潢川县| 绥宁县| 南安市| 玉环县| 汤阴县| 乌海市| 廉江市| 南投市| 阿拉善盟| 连州市| 铜陵市| 新竹县|