CA1815: Değer türlerinde eşittir ve işleç eşitliklerinin üzerine yaz
Özellik | Değer |
---|---|
Kural Kimliği | CA1815 |
Başlık | Değer türlerinde eşittir ve işleç eşittiri geçersiz kılın |
Kategori | Performans |
Hataya neden olan veya bozulmayan düzeltme | Hataya neden olmayan |
.NET 9'da varsayılan olarak etkin | Hayır |
Neden
Değer türü geçersiz kılmaz System.Object.Equals veya eşitlik işlecini (==) uygulamaz. Bu kural numaralandırmaları denetlemez.
Varsayılan olarak, bu kural yalnızca dışarıdan görünen türlere bakar, ancak bu yapılandırılabilir.
Kural açıklaması
Kesilebilir olmayan değer türleri için, devralınan System.Reflection uygulaması Equals tüm alanların içeriğini karşılaştırmak için kitaplığını kullanı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ın örnekleri karşılaştırmasını veya sıralamasını ya da karma tablo anahtarları olarak kullanmasını bekliyorsanız, değer türünüzün uygulaması Equalsgerekir. Programlama diliniz işleç aşırı yüklemesini destekliyorsa, eşitlik ve eşitsizlik işleçlerinin bir uygulamasını da sağlamanız gerekir.
İhlalleri düzeltme
Bu kuralın ihlalini düzeltmek için uygulamasını Equalssağlayın. Bunu yapabilirseniz, eşitlik işlecini uygulayın.
Uyarıların ne zaman bastırılması gerekiyor?
Değer türünün örnekleri birbiriyle karşılaştırılmayacaksa, bu kuraldan gelen bir uyarıyı bastırmak güvenlidir.
Uyarıyı gizleme
Yalnızca tek bir ihlali engellemek istiyorsanız, kuralı devre dışı bırakmak ve sonra yeniden etkinleştirmek için kaynak dosyanıza ön işlemci yönergeleri ekleyin.
#pragma warning disable CA1815
// The code that's violating the rule is on this line.
#pragma warning restore CA1815
Bir dosya, klasör veya projenin kuralını devre dışı bırakmak için, yapılandırma dosyasındaki önem derecesini none
olarak ayarlayın.
[*.{cs,vb}]
dotnet_diagnostic.CA1815.severity = none
Daha fazla bilgi için bkz . Kod analizi uyarılarını gizleme.
Çözümlemek için kod yapılandırma
Bu kuralın kod tabanınızın hangi bölümlerinde çalıştırılacaklarını yapılandırmak için aşağıdaki seçeneği kullanın.
Bu seçeneği yalnızca bu kural için, geçerli olduğu tüm kurallar için veya bu kategorideki (Performans) tüm kurallar için yapılandırabilirsiniz. Daha fazla bilgi için bkz . Kod kalitesi kuralı yapılandırma seçenekleri.
Belirli API yüzeylerini ekleme
Bu kuralın üzerinde çalıştırılacak kod tabanınızın hangi bölümlerini erişilebilirliklerine göre yapılandırabilirsiniz. Örneğin, kuralın yalnızca genel olmayan API yüzeyinde çalıştırılması gerektiğini belirtmek için projenizdeki bir .editorconfig dosyasına aşağıdaki anahtar-değer çiftini ekleyin:
dotnet_code_quality.CAXXXX.api_surface = private, internal
Örnek
Aşağıdaki kod, bu kuralı ihlal eden bir yapıyı (değer türü) gösterir:
// Violates this rule
public struct Point
{
public Point(int x, int y)
{
X = x;
Y = y;
}
public int X { get; }
public int Y { get; }
}
Aşağıdaki kod, eşitlik işleçlerini (==
!=
ve ) geçersiz kılıp System.ValueType.Equals uygulayarak önceki ihlali düzeltir:
public struct Point : IEquatable<Point>
{
public Point(int x, int y)
{
X = x;
Y = y;
}
public int X { get; }
public int Y { get; }
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);
}
}
İlgili kurallar
- CA2231: ValueType.Equals değerini geçersiz kılmada eşittir işlecini aşırı yükle
- CA2226: İşleçler simetrik aşırı yüklemelere sahip olmalıdır