Console.WriteLine(ReferenceEquals(1, 1)); // False
這個方法可以用來驗證字串駐留。當字串被駐留時,不會產生新的字串物件:Console.WriteLine(ReferenceEquals("a", "a")); // True
ReferenceEquals(a, b)
返回真,則返回真。a.Equals(b)
的形式)。重寫 Equals 方法通常指重寫下面的方法(當然這個方法也無法重寫)。
Equals(object a, object b)
是一樣的(也不可能不一樣吧!),即如果兩個物件皆為 null,或者具有相同的參照就返回真,否則就返回假。Equals(object a, object b)
也呼叫它,所以跟著結果也會改變。System.ValueType( 值型別 )
重寫了該方法,使得方法僅僅比較值是否相等。struct Rectangle { double width { get; set; } double height { get; set; } }需要重寫 Equals 方法。根據 MSDN,重寫的要求有:
public override bool Equals(object obj) { if(obj !=null&&obj is Rectangle) { //強行轉換為 Rectangle 型別 var rect = (Rectangle)obj; //遍歷所有屬性 return (rect.width == width) && (rect.height == height); } return false; }值得注意的是,雖然字串是參照型別,它也重寫了該方法,其行為和值型別一樣,也僅僅比較值是否相等。這是字串的行為看起來和值型別差不多的一個原因。
struct Rectangle { double width { get; set; } double height { get; set; } public Rectangle(double w,double h) { width = w; height = h; } public override bool Equals(object obj) { if (obj != null && obj is Rectangle) { //強行轉換為 Rectangle 型別 var rect = (Rectangle)obj; //面積相等嗎? return width*height == rect.width*rect.height; } return false; } }此時,下面的程式碼輸岀的結果一如預期:
var a = new Rectangle(1, 2); var b = new Rectangle(2, 1); Console.WriteLine(ReferenceEquals(a, b)); //False Console.WriteLine(a.Equals(b)); //true如果我們沒有重寫 Equals 方法的話,則應該輸出兩個 false。但是,我們不能直接使用 == 符號判等:
Console.WriteLine(a==b);
我們必須過載它:public static bool operator ==(Rectangle c1, Rectangle c2) { return c1.Equals(c2); } public static bool operator !=(Rectangle c1, Rectangle c2) { return !c1.Equals(c2); }此時,程式碼就會通過編譯並輸出正確的值。在過載 == 時,必須跟著一起過載 !=。
struct Rectangle:IEquatable<Rectangle> { double width { get; set; } double height { get; set; } public override bool Equals(object obj) { if (obj != null && obj is Rectangle) { //強行轉換為 Rectangle 型別 var rect = (Rectangle)obj; //面積相等嗎? return (rect.width==width)&&(rect.height==height); } return false; } public override int GetHashCode() { //保證語意一致性 return width.GetHashCode() * height.GetHashCode(); } //實現介面的方法,該方法會在傳入引數人Rectangle是優先於Object.Equals方法 //從而避免裝箱 public bool Equals(Rectangle other) { //遍歷所有屬性 return (other.width == width) && (other.height == height); } //過載等於號和不等號 public static bool operator == (Rectangle c1,Rectangle c2) { return c1.Equals(c2); } public static bool operator !=(Rectangle c1, Rectangle c2) { return !c1.Equals(c2); } }
static void Main(string[] args) { string a = "test"; var typea = a.GetType(); var typeb = Type.GetType("System.String"); var typec = typeof(string); Console.WriteLine(ReferenceEquals(typea, typeb)); //true Console.WriteLine(ReferenceEquals(typea, typec)); //true Console.ReadKey(); }