2009-05-30 62 views
0

值類型和引用類型爲引用類型(類),如點3(例如),這是一種矯枉過正,缺乏:最完整的Equals實現分別爲

#region System.Object Members 

public override bool Equals (object obj) 
{ 
     //return this == (Point3) obj; 

     if (obj == null) 
     { 
       return false; 
     } 

     if (this.GetType () != obj.GetType ()) 
     { 
       return false; 
     } 

     return this.Equals ((Point3) obj); 
} 

public override int GetHashCode () 
{ 
     return this.X.GetHashCode ()^this.Y.GetHashCode ()^this.Z.GetHashCode (); 
} 

public override string ToString () 
{ 
     return String.Format ("[{0}, {1}, {2}]", this.X, this.Y, this.Z); 
} 

#endregion 

#region IEquatable<Point3> Members 

public bool Equals (Point3 other) 
{ 
     if (other == null) 
     { 
       return false; 
     } 

     if (ReferenceEquals (this, other)) 
     { 
       return true; 
     } 

     if (this.GetHashCode () != other.GetHashCode ()) 
     { 
       return false; 
     } 

     if (!base.Equals (other)) 
     { 
       return false; 
     } 

     return this == other; 
} 

#endregion 

public static bool operator == (Point3 v0, Point3 v1) 
{ 
     return (v0.X.IsEqual (v1.X)) && (v0.Y.IsEqual (v1.Y)) && (v0.Z.IsEqual (v1.Z)); 
} 

public static bool operator != (Point3 v0, Point3 v1) 
{ 
     return !(v0 == v1); 
} 

請進行調整或張貼新的包括值和引用類型,我可以在我的基類型(值和引用)中使用,而不用每次重新實現時都考慮太多。

編輯:這是爲不可變的類型。

+0

呃......這裏有什麼問題? – configurator 2009-05-30 20:23:53

+0

你爲什麼要求別人爲你做你的工作?我可以理解徵求建議,但要求我們爲您解決問題是讓您的帖子關閉的好方法。 – jrista 2009-05-30 20:39:30

+0

是的,我真的提到它是一個ref類型。 – 2009-05-30 20:39:48

回答

3

this.GetType()!= obj.GetType()

這將是緩慢的。相反使用obj is Type

ReferenceEquals對於valueetypes是沒有意義的,我認爲point3是。

我也不打擾平等程序中的哈希碼檢查。

4

首先,不要陷入使用XOR作爲組合運算符生成散列碼的陷阱。

否則,你將有以下的問題,其中HC(x)表示「對象/ x值的哈希碼」:

HC(a,b) = HC(b,a) 
HC(a,a) = HC(b,b) = 0 

相反,選擇的東西,至少需要秩序將這些值考慮在內,如下所示:

hashcode = 23 // prime number 
for each sub-value of the object, do: 
    hashcode = hashcode * 31 // another prime number 
    hashcode = hashcode + the hashcode of the sub-value 

這將盡可能地保持預定義順序。

2

如果你真的進入了性能,並且你的值x,y和z不會改變(至少非常頻繁),但是你做了很多比較,你可以預先計算你的哈希碼。然後在平等比較期間儘早使用它。

但在這種情況下最好的是:使用探查器找到真正的瓶頸。

2

如果你正在創建自己的Equals方法,你應該考慮實現IEquatable。這給你一個很好的平等的方法來比較同類型,常常可以的Equals(對象)的方法削減到(引用類型):

public override Equals(object other) 
{ 
    Point3 otherP = other as Point3; 
    return otherP != null && Equals(otherP); // calls the Equals(Point3) method 
} 

除了作爲更好一點,這減少了如果類型是一個結構體,則使用盒子操作 - 如果IEquatable實現是隱式的,代碼將自動使用類型化的Equals(Point3)方法,而不是使用涉及盒子操作的Equals(object) )