以c#為例。
同一性:x.equals(x)為true,通過referenceequals(this, obj)實現;
自反性:x.equals(y) == y.equals(x),通過this.gettype() == obj.gettype()判斷型別是否相同,再進一步對屬性進行判斷;
傳遞性:if x.equals(y) == true && yequals(z) == true,then x.equals(z) == true;
x.equals(null)必須返回false,通過referenceequals(obj, null)實現。
一般equals判斷內容,==判斷位址;
在object基類中,equals呼叫==,所以也是判斷的位址;
重寫equals而不過載==,不會有警告,且此時呼叫==的話其實是呼叫的object的==,而不會呼叫重寫的equals;
過載==而不重寫 equals,會有警告,且此時呼叫equals會呼叫過載的==。
不要在過載==的時候通過a==null、b==null、a==b的方式來判斷引用的相等性,這會引起呼叫的死迴圈,用referenceequals(a,b)來代替。
過載==、!=成對出現;重寫了equals就必須重寫gethashcode以保證高層模組的正確呼叫。
public class node
public string birth
public override bool equals(object obj)
public override int gethashcode()
public static bool operator ==(inoculatornode i1, inoculatornode i2)
public static bool operator !=(inoculatornode i1, inoculatornode i2)
}
和equals的區別及重寫
1.共同點 都可以做比較,返回值都是boolean 2.不同點 1,是比較運算符號,既可以比較基本資料型別,也可以比較引用資料型別,基本資料型別比較的是值,引用資料型別比較的是位址值 2,equals方法只能比較引用資料型別,equals方法在沒有重寫之前,比較的是位址值,底層依賴的是 號,但是比較...
C 區別對待 和Equals,重寫Equals
clr中將 相等性 分為兩類 值相等性 和 引用相等性 值相等性 兩個變數所包含的數值相等。引用相等性 兩個變數引用的是記憶體中的同乙個物件。無論是操作符 還是方法 equals 都傾向於表達這樣乙個原則 對於值型別,如果型別的值相等,就應該返回true 對於引用型別,如果型別指向同乙個物件,則返回...
equals 的重寫規則
自反性 對於任何非null的引用值x,x.equals x 應返回true。對稱性 對於任何非null的引用值x與y,當且僅當 y.equals x 返回true時,x.equals y 才返回true。傳遞性 對於任何非null的引用值x y與z,如果y.equals x 返回true,y.equ...