CA1822: Üyeleri statik olarak işaretleyin

Özellik Değer
Kural Kimliği CA1822
Başlık Üyeleri static olarak işaretleyin
Kategori Performans
Düzeltme bozucu ya da bozmayan olabilir Bozulmaz - Derleme dışından görünmüyorsa, yaptığınız değişiklik ne olursa olsun üye için geçerlidir.

Kesintisiz - Üyeyi this anahtar sözcüğüyle bir örnek üyesi olarak değiştirirseniz.

Breaking - Üyeyi bir örnek üyesinden statik üyeye değiştirirseniz ve derlemenin dışında görünür durumdaysa.
.NET 10'da varsayılan olarak etkin Öneri olarak
Geçerli diller C# ve Visual Basic

Neden

Örnek verisine erişmeyen bir üye statik olarak işaretlenmez (Visual Basic'te Paylaşılan).

Kural açıklaması

Örnek verilerine erişmeyen veya örnek yöntemlerini çağırmayan üyeler statik olarak işaretlenebilir (Visual Basic'te paylaşılan). Yöntemleri statik olarak işaretledikten sonra, derleyici bu üyeler için sanal olmayan çağrı noktalarını oluşturur. Sanal olmayan çağrı sitelerini yayma, geçerli nesne işaretçisinin null olmamasını sağlayan her çağrı için çalışma zamanında bir denetim yapılmasını engeller. Bu, performansa duyarlı kod için ölçülebilir bir performans kazancı elde edebilir. Bazı durumlarda, geçerli nesne örneğine erişilamaması bir doğruluk sorununu temsil eder.

İhlalleri düzeltme

Üyeyi statik (veya Visual Basic'te Paylaşılan) olarak işaretleyin veya uygunsa yöntem gövdesinde 'this'/'Me' kullanın.

Example

public class Printer
{
    private readonly List<char> _items = [
        'H', 'e', 'l', 'l', 'o',
    ];

    public void PrintHello()
    {
        BadPrintHelloInternal();
        GoodPrintHelloInternal();
        GoodPrintHelloStaticInternal();
    }

    // This method violates the rule.
    private void BadPrintHelloInternal()
    {
        Console.WriteLine("Hello");
    }

    // This methods satisfies the rule.
    private void GoodPrintHelloInternal()
    {
        Console.WriteLine(string.Join(string.Empty, this._items));
    }

    private static void GoodPrintHelloStaticInternal()
    {
        Console.WriteLine("Hello");
    }
}

Uyarıların ne zaman bastırılması gerekiyor?

Aşağıdaki durumlarda bu kuraldan gelen bir uyarıyı engellemek güvenlidir:

  • Düzeltmenin hataya neden olacağı önceden gönderilen kod için.
  • MarshalByRefObject sınıfından devralan sınıflardaki yöntemler için. .NET uzaktan iletişim altyapısı çağrıları AppDomain sınırları arasında iletmek için örnek dağıtımı kullandığından, bu sınıflardaki yöntemler statik olarak işaretlenmemelidir. Bu tür yöntemlerin statik hale getirilmesi, AppDomain sınırları arasında uzaktan iletişimi bozabilir.

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 CA1822
// The code that's violating the rule is on this line.
#pragma warning restore CA1822

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.CA1822.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.