CA1815: Değer türlerinde Equals ve eşitlik işleçlerini geçersiz kılın

Ö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);
    }
}

Ayrıca bkz.