假设我有一个Point2类,我想实现以下Equals: public override bool Equals ( object obj )public bool Equals ( Point2 obj ) 这来自Effective C#3书: public override bool Equals ( object obj ){ // STEP 1: Check for null if ( obj
public override bool Equals ( object obj ) public bool Equals ( Point2 obj )
这来自Effective C#3书:
public override bool Equals ( object obj ) { // STEP 1: Check for null if ( obj == null ) { return false; } // STEP 3: equivalent data types if ( this.GetType ( ) != obj.GetType ( ) ) { return false; } return Equals ( ( Point2 ) obj ); } public bool Equals ( Point2 obj ) { // STEP 1: Check for null if nullable (e.g., a reference type) if ( obj == null ) { return false; } // STEP 2: Check for ReferenceEquals if this is a reference type if ( ReferenceEquals ( this, obj ) ) { return true; } // STEP 4: Possibly check for equivalent hash codes if ( this.GetHashCode ( ) != obj.GetHashCode ( ) ) { return false; } // STEP 5: Check base.Equals if base overrides Equals() System.Diagnostics.Debug.Assert ( base.GetType ( ) != typeof ( object ) ); if ( !base.Equals ( obj ) ) { return false; } // STEP 6: Compare identifying fields for equality. return ( ( this.X.Equals ( obj.X ) ) && ( this.Y.Equals ( obj.Y ) ) ); }
这有点矫枉过正吗?
支持与继承层次结构的相等性是棘手的.你需要弄清楚你的意思.你真的需要继承吗?如果不是 – 如果Point2直接从System.Object派生,并且你可以使它密封,生活变得容易一些.在那种情况下,我会使用:public override bool Equals (object obj) { return Equals(obj as Point2); } public bool Equals (Point2 obj) { // STEP 1: Check for null if nullable (e.g., a reference type) // Note use of ReferenceEquals in case you overload ==. if (object.ReferenceEquals(obj, null)) { return false; } // STEP 2: Check for ReferenceEquals if this is a reference type // Skip this or not? With only two fields to check, it's probably // not worth it. If the later checks are costly, it could be. if (object.ReferenceEquals( this, obj)) { return true; } // STEP 4: Possibly check for equivalent hash codes // Skipped in this case: would be *less* efficient // STEP 5: Check base.Equals if base overrides Equals() // Skipped in this case // STEP 6: Compare identifying fields for equality. // In this case I'm using == instead of Equals for brevity // - assuming X and Y are of a type which overloads ==. return this.X == obj.X && this.Y == obj.Y; }