CA1815: Değer türlerinde eşittir ve işleç eşitliklerinin üzerine yaz
TürAdı |
OverloadOperatorEqualsOnOverridingValueTypeEquals |
CheckId |
CA1815 |
Kategori |
Microsoft.Performance |
Bozan Değişiklik |
Bozmayan |
Ortak değer türü Object.Equals 'i geçersiz kılmaz veya eşitlik işleci (==)'ni uygulamaz.Bu kural, numaralandırmaları denetlemez.
Değer türleri için, Equals 'in uygulama mirası, Reflection kitaplığını kullanır ve türündeki tüm alanların içeriğini karşılaştırır.Yansıma hesaplama açısından pahalıdır ve her alan için eşitlik karşılaştırma gereksiz olabilir.Kullanıcıları karşılaştırmak, örneklerini sıralamak veya tablo anahtarlarını karma olarak kullanılmalarını bekliyorsanız, değer türünüz Equals'i uygulamalıdır.Programlama diliniz operatörün aşırı yüklemesine destek sağlıyorsa, eşitlik ve eşitsizlik operatörleri için uygulama sağlamalısınız.
Bu kuralın ihlalini düzeltmek için, Equals 'un uygulamasını sağlamak.Mümkünse, eşitlik işlecinin uygulaması
Değer türünün örnekleri birbiri ile karşılaştırılamayacaksa, bu kuraldan bir uyarı bastırmak güvenlidir.
Aşağıdaki örnek, bu kuralı ihlal eden bir yapıyı (değer türü) gösterir.
using System;
namespace Samples
{
// Violates this rule
public struct Point
{
private readonly int _X;
private readonly int _Y;
public Point(int x, int y)
{
_X = x;
_Y = y;
}
public int X
{
get { return _X; }
}
public int Y
{
get { return _Y; }
}
}
}
Aşağıdaki örnek, ValueType.Equals 'i geçersiz kılarak ve eşitlik işlecini (==,! =) uygulayarak önceki ihlalini düzeltir.
using System;
namespace Samples
{
public struct Point : IEquatable<Point>
{
private readonly int _X;
private readonly int _Y;
public Point(int x, int y)
{
_X = x;
_Y = y;
}
public int X
{
get { return _X; }
}
public int Y
{
get { return _Y; }
}
public override int GetHashCode()
{
return _X ^ _Y;
}
public override bool Equals(object obj)
{
if (!(obj is Point))
return false;
return Equals((Point)obj);
}
public bool Equals(Point other)
{
if (_X != other._X)
return false;
return _Y == other._Y;
}
public static bool operator ==(Point point1, Point point2)
{
return point1.Equals(point2);
}
public static bool operator !=(Point point1, Point point2)
{
return !point1.Equals(point2);
}
}
}
CA2224: Eşittir işlecini aşırı yükleyerek eşittiri geçersiz kılın
CA2231: ValueType.Equals değerini geçersiz kılmada eşittir işlecini aşırı yükle