مشاركة عبر


قم بتنفيذ الأسلوب يساوي

For related معلومات تشغيل implementing the equality عامل (==), see Guidelines for Implementing يساوي و the Equality عامل (==).

  • يمنع the GetHashCode أسلوب إلى allow a نوع إلى work correctly في a جدول التجزئة.

  • Do not رمى an ‏‏ استثناء في the implementation of an يساوي أسلوب. Instead, return خطأ for a null وسيطة.

  • Follow the اتفاق defined تشغيل the كائن.يساوي أسلوب كـ follows:

    • x.Equals(x) إرجاع صواب.

    • x.Equals(y) إرجاع the same القيمة كـ y.Equals(x).

    • (x.Equals(y) && y.Equals(z))إرجاعصواب if و only if x.Equals(z)returnstrue.

    • invocations المتتابعة من x.Equals(y)بإرجاع نفس الالقيمة كـ طويلاً كـ الكائنات المشار إليه بواسطة xو yلم يتم ‏‏تاريخ التعديل.

    • x.Equals(null)إرجاعfalse.

  • لبعض أنواع الكائنات، فإنه هو مطلوباً لجعل يساوي اختبار مساواة القيمة بدلاً من مساواة المرجعي. إرجاع تطبيقات مثل يساوي true في حالة اثنين الكائنات لها نفس القيمة، حتى ولو كانت نفسه لا مثيل. تعريف ما تمثل الالقيمة لكائن هو إلى implementer من النوع، ولكنه هو عادة بعض أو الجميع بيانات المخزنة في متغيرات المثيل الخاص بالكائن. تشغيل سبيل المثال، القيمة سلسلة هو استناداً إلى حرف/ حروف من السلسلة; يساوي أسلوب سلسلة الفئة بإرجاع true لأي مثيلين من السلسلة التي تحتوي تشغيل نفس حرف/ حروف بنفس الترتيب تماما.

  • عندما يوفر يساوي أسلوب فئة أساسية مساواة القيمة، يجب الاتصال يمنع يساوي في فئة مشتقة التنفيذ يساوي الموروثة.

  • إذا كنت في البرمجة في لغة تدعم التحميل الزائد لعامل التشغيل، واختيار زيادة التحميل عامل تشغيل المساواة (==) لمعين نوع، لذلك نوع يجب أن تتجاوز يساوي أسلوب . يجب أن تعود مثل تطبيقات الطريقة يساوي نفس نتائج كـ عامل المساواة. اتباع th هو إرشاد يساعد التأكد من أن مكتبة التعليمات البرمجية فئة باستخدام يساوي (such كـArrayListوHashtable) يعمل بطريقة التي هو consهوtent بطريقة عامل التشغيل مساواة هو المستخدمة من قبل تطبيقات البرمجية.

  • إذا تم تطبيق نوع القيمة، يجب تجاوز يساوي أسلوب إلى الحصول تشغيل زيادة أداء تطبيق الافتراضي يساوي الأسلوب تشغيل ValueType. زيادة إذا قمت بتجاوز يساوي يعتمد اللغة التحميل الزائد لعامل التشغيل، يجب التحميل عامل مساواة للقيمة الخاصة بك نوع.

  • إذا تم تطبيق نوع المرجع s، يجب تجاوز يساوي أسلوب على نوع المرجع إذا كان نوع يشبه نوع أساس، مثل Point، String، BigNumber، وهكذا دواليك. Most مرجع أنواع should not التحميل الزائد the equality عامل, even if they يمنع يساوي. ومع ذلك، إذا قمت بتنفيذ مرجع نوع التي هو الغرض من وجود دلالات القيمة، مثل نوع رقم المركب، يجب تجاوز عامل المساواة.

  • إذا قمت بتطبيق IComparableواجهة تشغيل نوع محدد، يجب أن تتجاوز يساوي تشغيل هذا النوع.

أمثلة

توضح الأمثلة تعليمات برمجية التالية تطبيق، الاتصال متجاوز و التحميل الزائد يساوي أسلوب .

قم بتنفيذ الأسلوب يساوي

مثال التعليمة البرمجية التالية تحتوي على استدعاءات الثاني إلى تطبيق الافتراضي يساوي أسلوب .

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 = obj2
      Console.WriteLine(obj1.Equals(obj2))
   End Sub
End Class
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

تجاوز يساوي أسلوب

يظهر المثال تعليمات برمجية التالي Pointفئة يتجاوز يساوي الطريقة لتوفير القيمة مساواة وعلى فئة Point3D، أي هو مشتقة من Point. نظراً Pointيمنع للفئة يساوي هو أول في سلسلة توريث إلى تقديم القيمة المساواة، لا يتم استدعاء يساوي أسلوب فئة الأساس (التي موروثة من الكائن واختبارات لمساواة المرجعي). وعلى الرغم من ذلك، Point3D.Equalsاستدعاء Point.Equalsلأن Pointيطبق يساوي بطريقة توفر مساواة القيمة.

Namespace Examples.DesignGuidelines.EqualsImplementation

Public Class Point  
   Protected x As Integer
   Protected y As Integer

   Public Sub New (xValue As Integer, yValue As Integer)
    Me.x = xValue
    Me.y = yValue
   End Sub

   Public Overrides Overloads Function Equals(obj As Object) As Boolean

      If obj Is Nothing OrElse Not Me.GetType() Is obj.GetType() Then
         Return False
      End If

      Dim p As Point = CType(obj, Point)
      Return Me.x = p.x And Me.y = p.y
   End Function 

   Public Overrides Function GetHashCode() As Integer
      Return x Xor y
   End Function 
End Class 

Public Class Point3D
   Inherits Point
   Private z As Integer

   Public Sub New (xValue As Integer, yValue As Integer, zValue As Integer)
      MyBase.New(xValue, yValue)
      Me.z = zValue
   End Sub

   Public Overrides Overloads Function Equals(obj As Object) As Boolean
      Return MyBase.Equals(obj) And z = CType(obj, Point3D).z
   End Function 

   Public Overrides Function GetHashCode() As Integer
      Return MyBase.GetHashCode() Xor z
   End Function 
End Class 

End Namespace

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) 
   {
      // Check for null values and compare run-time types.
      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أسلوب التحقق التي وسيطة الكائنات هو null وتشير إلى وجود مثيل من النوع نفسه كترتيب غير هو الكائن. إذا كان أي من التدقيقات يفشل، الأسلوب إرجاع خطأ . يستخدم يساوي أسلوب GetTypeطريقة لتحديد ما إذا كان هناك تطابق بين أنواع وقت التشغيل الكائنين. لاحظ أن typeof (TypeOfفي Visual أساسى) لا تستخدم هنا لأنها تقوم بإرجاع نوع ثابت. لو استخدمت الأسلوب عملية تحقق لنموذج obj is Point بدلاً من ذلك، سيتم إرجاع فحص حالات حقيقية في مكان الكائنات هو مثيلاً لفئة مشتقة من Point، على الرغم من الكائنات والمثيل الحالي ليست من نفس نوع وقت التشغيل. عند التحقق من أن تكون كل من كائنات من نفس النوع، casts الأسلوب الكائنات كتابة Pointو إرجاع نتيجة لمقارنة متغيرات مثيل لكائنات اثنين.

في Point3D.Equals، موروثة من يساوي أسلوب هو طلبه من قبل أى شىء آخر هو الانتهاء. الموروثة يساوي أسلوب بالتحقق من تلك الكائنات ليس هو null، التي الكائنات مثيل في نفس فئة كهذا الكائن، والتي تطابق المتغيرات مثيل الموروثة. فقط عندما يعود موروثة يساوي صحيحاً هل يقارن الأسلوب مثيل متغيرات المقدمة في فئة مشتقة. على وجه الخصوص، الإضافة إلى Point3Dهو لا يتم تنفيذها إلا إذا الكائنات التي تم التأكد من أن تكون من نوع Point3Dأو فئة مشتقة من Point3D.

استخدام أسلوب يساوي إلى يقارن مثيل متغيرات

في المثال السابق، وعامل تشغيل المساواة (==) هو يستخدم لمقارنة متغيرات المثيل الفردي. في بعض الحالات، كان من المناسب استخدام يساوي الأسلوب لمقارنة متغيرات المثيل في تطبيق يساوي ، كما هو موضح في التالية تعليمات برمجية المثال.

Imports System

Class Rectangle
   Private a, b As Point
   
   Public Overrides Overloads Function Equals(obj As [Object]) As Boolean
      If obj Is Nothing Or Not Me.GetType() Is obj.GetType() Then
         Return False
      End If
      Dim r As Rectangle = CType(obj, Rectangle)
      ' Use Equals to compare instance variables.
      Return Me.a.Equals(r.a) And Me.b.Equals(r.b)
   End Function 
   
   Public Overrides Function GetHashCode() As Integer
      Return a.GetHashCode() ^ b.GetHashCode()
   End Function 
End Class 
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;
      // Use Equals to compare instance variables.
      return a.Equals(r.a) && b.Equals(r.b);
   }
   public override int GetHashCode() 
   {
      return a.GetHashCode() ^ b.GetHashCode();
   }
}

التحميل الزائد عامل تشغيل مساواة (==) و الأسلوب يساوي

في بعض اللغات، مثل C#، التحميل الزائد لعامل التشغيل في البرمجة هو معتمدة. عند التحميلات الزائدة نوعا operaإلىr مساواة (==)، يجب أيضا يمنع يساوي أسلوب إلى توفر الوظيفة نفسها. Th هو هو accomplهوhed عادة بكتابة يساوي الطريقة من عامل تشغيل المساواة overloaded (==)، كما في مثال التعليمة البرمجية التالية.

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. ولذلك، لا يحتاج يساوي أسلوب إلى مقارنة نتائج GetType لكل كائن. بدلاً من ذلك فإنه يستخدم operaإلىr هو إلى التحقق من نوع معلمة الكائنات.

أجزاء حقوق النشر 2005 Microsoft Office 2010 Suite Corporation. كافة الحقوق محفوظة.

أجزاء حقوق النشر شركة Addison-Wesley. كافة الحقوق محفوظة.

ل المزيد المعلومات تشغيل إرشادات التصميم، راجع "إطار عمل إرشادات التصميم: كتاب اصطلاحات، Idioms، و نقش لمكتبات.NET القابل لإعادة الاستخدام"ب Krzysztof Cwalina و رفيق Abrams، ينشره Addison-Wesley، 2005.

راجع أيضًا:

موارد أخرى

تصميم إرشادات لتطوير مكتبات فئة