日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

.NET 指南:实现 Equals 方法

發布時間:2024/4/14 asp.net 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .NET 指南:实现 Equals 方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

關于實現等式操作符(==)的相關信息,請參考:[Equals 與等式操作符(==)的實現指南]。

  • 重載 GetHashCode 方法來允許類型在散列數據表中正確地運作。
  • 不要在 Equals 方法的實現中拋出異常。而是為 null 參量而返回 false。
  • 遵循 Object.Equals 方法中被定義的約定,如下所示:

    • x.Equals(x) 返回 true。
    • x.Equals(y) 與 y.Equals(x) 返回相同的值。
    • (x.Equals(y) && y.Equals(z)) 返回 true,如果 x.Equals(y) 或者 x.Equals(z) 的其中一個返回了 true,就直接返回 true。
    • 只要通過 x 與 y 被引用的對象沒有被更改,對于 x.Equals(y) 的連續調用就會返回相同的值。
    • x.Equals(null) 返回 false。
  • 至于一些類別的對象,為值的相等而進行 Equals 測試來替代參考相等的做法是值得的。如果兩個對象都有相同的值,那么就為 Equals 的實現而返回 true,即使它們不是相同的實例。對象值的組成定義等于類型的實現器,但是它通常是部分或者所有被存儲在對象的實例變量中的數據。例如,一個基于字符串的值;String 類的 Equals 方法會為任何兩個包含相同內容的字符串實例而返回 true 值。
  • 在一個基類的 Equals 方法中提供了相等的值的時候,派生類中的 Equals 方法重載就應該調用被繼承的 Equals 實現。
  • 如果你使用了一種支持操作符重載的編程語言,并且你為一個被指定的類型而重載了等式操作符(==),那么這個類型就應該重載 Equals 方法。這種 Equals 方法的實現應該能夠返回與等式操作符相同的結果。下列指南將有助于確保類庫的代碼中使用了 Equals(如 ArrayList 與 Hashtable)并且正確地運作在以等式操作符通過應用程序代碼而被使用的一致風格中。
  • 如果你實現了一個值類型,那么你應該考慮重載 Equals 方法來獲取在 ValueType 的默認 Equals 方法實現之上的被增強的性能。如果你重載了 Equals 以及編程語言所支持的操作符重載,那么你應該為你的值類型而重載等式操作符。
  • 如果你實現了引用類型,并且如果你的類型與基類型(如 Point、String、BigNumber,以及等等)一樣,那么你應該考慮重載一個引用類型的 Equals 方法。大部分的引用類型都不應該重載等式操作符,即使它們已經重載了 Equals 方法。但是,如果你實現了一個被打算用來持有值語法的引用類型(如一個復合的數字類型),那么你就應該重載等式操作符。
  • 如果你為一個給定的類型實現了 IComparable 接口,你應該為那個類型而重載 Equals。

范例

下列代碼范例示范了 Equals 方法的實現、重載調用,以及重載。

實現 Equals 方法

下列代碼范例包含了對于默認 Equals 方法實現的兩個調用。

Visual Basic
Imports System Class SampleClass Public Shared Sub Main()Dim obj1 As New System.Object()Dim obj2 As New System.Object()Console.WriteLine(obj1.Equals(obj2))obj1 = obj2Console.WriteLine(obj1.Equals(obj2))End Sub End Class
C#
using System; class SampleClass {public static void Main() {Object obj1 = new Object();Object obj2 = new Object();Console.WriteLine(obj1.Equals(obj2));obj1 = obj2; Console.WriteLine(obj1.Equals(obj2)); } }

前述代碼的輸出如下:

False True
重載 Equals 方法

下列代碼范例說明了重載 Equals 方法來提供值等式的一個 Point 類以及 Point 的派生類 Point3D。因為 Point 類的 Equals 重載是最先在繼承鏈中被用來引入值等式的重載,所以基類(派生自 Object 并且檢查參考等式)的 Equals 方法不會被調用。但是,Point3D.Equals 會調用 Point.Equals,因為 Point 是以提供值等式的風格來實現 Equals 的。

Visual Basic
Namespace Examples.DesignGuidelines.EqualsImplementationPublic Class Point Protected x As IntegerProtected y As IntegerPublic Sub New (xValue As Integer, yValue As Integer)Me.x = xValueMe.y = yValueEnd SubPublic Overrides Overloads Function Equals(obj As Object) As BooleanIf obj Is Nothing OrElse Not Me.GetType() Is obj.GetType() ThenReturn FalseEnd IfDim p As Point = CType(obj, Point)Return Me.x = p.x And Me.y = p.yEnd Function Public Overrides Function GetHashCode() As IntegerReturn x Xor yEnd Function End Class Public Class Point3DInherits PointPrivate z As IntegerPublic Sub New (xValue As Integer, yValue As Integer, zValue As Integer)MyBase.New(xValue, yValue)Me.z = zValueEnd SubPublic Overrides Overloads Function Equals(obj As Object) As BooleanReturn MyBase.Equals(obj) And z = CType(obj, Point3D).zEnd Function Public Overrides Function GetHashCode() As IntegerReturn MyBase.GetHashCode() Xor zEnd Function End Class End Namespace
C#
using System;namespace Examples.DesignGuidelines.EqualsImplementation { class Point: object {protected int x, y;public Point(int xValue, int yValue){x = xValue;y = yValue;}public override bool Equals(Object obj) {// 檢查 null 值并且比較運行時類型。if (obj == null || GetType() != obj.GetType()) return false;Point p = (Point)obj;return (x == p.x) && (y == p.y);}public override int GetHashCode() {return x ^ y;} }class Point3D: Point {int z;public Point3D(int xValue, int yValue, int zValue) : base(xValue, yValue){z = zValue;}public override bool Equals(Object obj) {return base.Equals(obj) && z == ((Point3D)obj).z;}public override int GetHashCode() {return base.GetHashCode() ^ z;} } }

Point.Equals 方法檢查到 obj 參量不是 null 值并且它還引用了與這個對象相同的一個類型實例。如果其中一種檢查失敗,方法返回 false 值。Equals 方法使用 GetType 方法來檢查這兩個對象的運行時類型是否完全相同。注意:typeof(在 Visual Basic 中是 TypeOf)在這里沒有被使用,因為它返回靜態的類型。如果方法已經被用來檢查 obj 是否被替換成 Point,那么在 obj 是由 Point 所派生的一個實例的情況下,檢查將會返回 true,盡管 obj 以及當前實例不是相同的運行時類型。已經被核實的那兩個對象就是相同的類型,方法把 obj 轉換成 Point 類型并且返回兩個對象實例變量的對比結果。

在 Point3D.Equals 中,被繼承的 Equals 方法在任何操作被完成之前被調用。被繼承的 Equals 方法會核實那個 obj 不是 null、那個 obj 是與該對象一樣的相同實例,并且被繼承的實例變量相匹配。只在被繼承的 Equals 返回 true 值的時候,方法才能夠對比被引入到派生類中的實例變量。尤其是,對于 Point3D 的轉換并沒有被執行,除非已經檢測到 obj 是 Point3D 類型或者是一個派生自 Point3D 的類。

使用 Equals 方法來對比實例變量

在前面的范例中,等式操作符(==)被用來對比單獨的實例變量。在有些情況下,它適合于使用 Equals 方法在 Equals 的一個實現中對比實例變量,如下代碼范例所示。

Visual Basic
Imports SystemClass RectanglePrivate a, b As PointPublic Overrides Overloads Function Equals(obj As [Object]) As BooleanIf obj Is Nothing Or Not Me.GetType() Is obj.GetType() ThenReturn FalseEnd IfDim r As Rectangle = CType(obj, Rectangle)' 使用 Equals 來對比實例變量。Return Me.a.Equals(r.a) And Me.b.Equals(r.b)End Function Public Overrides Function GetHashCode() As IntegerReturn a.GetHashCode() ^ b.GetHashCode()End Function End Class
C#
using System; class Rectangle {Point a, b;public override bool Equals(Object obj) {if (obj == null || GetType() != obj.GetType()) return false;Rectangle r = (Rectangle)obj;// 使用 Equals 來對比實例變量。return a.Equals(r.a) && b.Equals(r.b);}public override int GetHashCode() {return a.GetHashCode() ^ b.GetHashCode();} }
重載等式操作符(==)與 Equals 方法

在有些編程語言中(如 C#),操作符重載是被支持的。在一個類型重載了等式操作符(==)的時候,它應該同樣重載 Equals 方法來提供相同的功能。這典型地通過在被重載的等式操作符(==)術語中編寫 Equals 方法而被完成,如下代碼范例所示。

C#
public struct Complex {double re, im;public override bool Equals(Object obj) {return obj is Complex && this == (Complex)obj;}public override int GetHashCode() {return re.GetHashCode() ^ im.GetHashCode();}public static bool operator ==(Complex x, Complex y) {return x.re == y.re && x.im == y.im;}public static bool operator !=(Complex x, Complex y) {return !(x == y);} }

因為 Complex 是一個 C# 結構(一個值類型),并且已知沒有任何類將會從 Complex 那里被派生。因此,Equals 方法不需要對比每個對象的 GetType 結果。代替它的是使用 is 操作符來檢查 obj 參數的類型。

轉載于:https://www.cnblogs.com/Laeb/archive/2007/02/04/639594.html

總結

以上是生活随笔為你收集整理的.NET 指南:实现 Equals 方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。