قم بتنفيذ الأسلوب يساوي
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.