Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
| Özellik | Değer |
|---|---|
| Kural Kimliği | CA1815 |
| Başlık | Değer türlerinde Equals ve eşittir operatörünü geçersiz kılın |
| Kategori | Performans |
| Düzeltme bozucu ya da bozmayan olabilir | Kesintisiz |
| .NET 10'da varsayılan olarak etkin | Hayır |
| Geçerli diller | C# ve Visual Basic |
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ı
Blittable olmayan değer türleri için, devralınan Equals uygulaması tüm alanların içeriğini karşılaştırmak için System.Reflection kütüphanesini kullanır. Yansıma, hesaplama açısından yüksek maliyetlidir ve her alanın eşitlik için karşılaştırılması 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. Eğer mümkünse 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 noneolarak ayarlayın.
[*.{cs,vb}]
dotnet_diagnostic.CA1815.severity = none
Daha fazla bilgi için bkz . Kod analizi uyarılarını gizleme.
Kod çözümleme için konfigüre et
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
api_surface seçeneğini ayarlayarak, bu kuralın erişilebilirliği temelinde kod tabanınızın hangi bölümlerinde çalıştırılacaklarını 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
Not
XXXX
CAXXXX bölümünü geçerli kuralın kimliğiyle değiştirin.
Ö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 (System.ValueType.Equals==ve ) geçersiz kılıp != 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'i geçersiz kılarken eşittir operatörünü aşırı yükleyin
- CA2226: İşleçler simetrik aşırı yüklemelere sahip olmalıdır