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 8'de 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 noneolarak 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);
    }
}

Ayrıca bkz.