ca1013: يساوي عامل التحميل الزائد تشغيل التحميل الزائد إضافة وطرح
TypeName |
OverloadOperatorEqualsOnOverloadingAddAndSubtract |
CheckId |
ca1013 |
Category |
Microsoft.تصميم |
تعطيل تغيير |
غير فاصلة |
السبب
نوع عامة أو محمية بتطبيق عوامل الجمع أو الطرح أو بدون تطبيق عامل المساواة.
وصف القاعدة
عند مثيلات نوع يمكن دمجها باستخدام العمليات مثل الجمع والطرح، يجب دائماً تحديد مساواة إرجاع trueلأي مثيلين التي لها نفس قيم constituent.
لا يمكنك استخدم العامل مساواة الافتراضي في تطبيق overloaded لعامل تشغيل المساواة. ستؤدي هذه العملية في تجاوز سعة مكدس. إلى تنفيذ operaإلىr مساواة، استخدم الأسلوب كائن.يساوي في التطبيق الخاص بك. فعلى سبيل المثال:
If (Object.ReferenceEquals(left, Nothing)) Then
Return Object.ReferenceEquals(right, Nothing)
Else
Return left.Equals(right)
End If
if (Object.ReferenceEquals(left, null))
return Object.ReferenceEquals(right, null);
return left.Equals(right);
كيف إلى الإصلاح انتهاكات
لإصلاح انتهاكا لترتيب هو قاعدة، تطبيق عامل التشغيل مساواة حيث أنه هو consهوtent حسابي باستخدام العوامل الجمع والطرح.
عند إلى منع التحذيرات
أمان لمنع ظهور تحذير من هذه قاعدة عندما يوفر تطبيق الافتراضي العامل مساواة سلوك الصحيح نوع.
مثال
يحدد المثال التالي هو نوع ( BadAddableType) التي تخالف هذه قاعدة. وهذا نوع يجب تطبيق عامل التشغيل مساواة لجعل أي مثيلين بنفس قيم حقل اختبار trueلمساواة. نوع GoodAddableTypeيظهر التطبيق الذي تم تصحيحه. لاحظ أن هذا النوع أيضا يطبق عامل inequality يتجاوز Equalsلتصحيح القواعد الأخرى. تنفيذ كامل ما ستقوم أيضا بتنفيذ GetHashCode.
using System;
namespace DesignLibrary
{
public class BadAddableType
{
private int a, b;
public BadAddableType(int a, int b)
{
this.a = a;
this.b = b;
}
// Violates rule: OverrideOperatorEqualsOnOverridingAddAndSubtract.
public static BadAddableType operator +(BadAddableType a, BadAddableType b)
{
return new BadAddableType(a.a + b.a, a.b + b.b);
}
// Violates rule: OverrideOperatorEqualsOnOverridingAddAndSubtract.
public static BadAddableType operator -(BadAddableType a, BadAddableType b)
{
return new BadAddableType(a.a - b.a, a.b - b.b);
}
public override string ToString()
{
return String.Format("{{{0},{1}}}", a, b);
}
}
public class GoodAddableType
{
private int a, b;
public GoodAddableType(int a, int b)
{
this.a = a;
this.b = b;
}
// Satisfies rule: OverrideOperatorEqualsOnOverridingAddAndSubtract.
public static bool operator ==(GoodAddableType a, GoodAddableType b)
{
return (a.a == b.a && a.b == b.b);
}
// If you implement ==, you must implement !=.
public static bool operator !=(GoodAddableType a, GoodAddableType b)
{
return !(a==b);
}
// Equals should be consistent with operator ==.
public override bool Equals(Object obj)
{
GoodAddableType good = obj as GoodAddableType;
if (obj == null)
return false;
return this == good;
}
public static GoodAddableType operator +(GoodAddableType a, GoodAddableType b)
{
return new GoodAddableType(a.a + b.a, a.b + b.b);
}
public static GoodAddableType operator -(GoodAddableType a, GoodAddableType b)
{
return new GoodAddableType(a.a - b.a, a.b - b.b);
}
public override string ToString()
{
return String.Format("{{{0},{1}}}", a, b);
}
}
}
المثال التالي باختبار لمساواة باستخدام مثيلات أنواع تم تعريفه مسبقاً في هذا إلى pic إلى توضيح الافتراضية والسلوك الصحيح ل operaإلىr المساواة.
using System;
namespace DesignLibrary
{
public class TestAddableTypes
{
public static void Main()
{
BadAddableType a = new BadAddableType(2,2);
BadAddableType b = new BadAddableType(2,2);
BadAddableType x = new BadAddableType(9,9);
GoodAddableType c = new GoodAddableType(3,3);
GoodAddableType d = new GoodAddableType(3,3);
GoodAddableType y = new GoodAddableType(9,9);
Console.WriteLine("Bad type: {0} {1} are equal? {2}", a,b, a.Equals(b)? "Yes":"No");
Console.WriteLine("Good type: {0} {1} are equal? {2}", c,d, c.Equals(d)? "Yes":"No");
Console.WriteLine("Good type: {0} {1} are == ? {2}", c,d, c==d? "Yes":"No");
Console.WriteLine("Bad type: {0} {1} are equal? {2}", a,x, a.Equals(x)? "Yes":"No");
Console.WriteLine("Good type: {0} {1} are == ? {2}", c,y, c==y? "Yes":"No");
}
}
}
ينتج هذا المثال الإخراج التالي:
Bad type: {2,2} {2,2} are equal? No Good type: {3,3} {3,3} are equal? Yes Good type: {3,3} {3,3} are == ? Yes Bad type: {2,2} {9,9} are equal? No Good type: {3,3} {9,9} are == ? No