Aracılığıyla paylaş


CA1810: Başvuru türü statik alanları satır içi başlatın

Özellik Değer
Kural Kimliği CA1810
Başlık Başvuru türü statik alanları satır içinden başlatın
Kategori Performans
Hataya neden olan veya bozulmayan düzeltme Hataya neden olmayan
.NET 8'de varsayılan olarak etkin Hayır

Neden

Bir başvuru türü açık bir statik oluşturucu bildirir.

Kural açıklaması

Bir tür açık statik yapıcı bildirdiğinde, JIT derleyici her bir statik yöntemi kontrol ekler ve türün yapıcı örneği statik yapıcının daha önceden çağrıldığından emin olur. Statik başlatma, herhangi bir statik üyeye erişildiğinde veya türün bir örneği oluşturulduğunda tetiklenir. Ancak, türün bir değişkenini bildirirseniz ancak bunu kullanmazsanız statik başlatma tetiklenmez. Bu, başlatmanın genel durumunu değiştirmesi durumunda önemli olabilir.

Tüm statik veriler satır içinde başlatıldığında ve açık bir statik oluşturucu bildirilmezse, ortak ara dil (CIL) derleyicileri bayrağını beforefieldinit ve statik verileri başlatan örtük bir statik oluşturucuyu CIL tür tanımına ekler. JIT derleyicisi bayrağıyla karşılaştığında beforefieldinit , çoğu zaman statik oluşturucu denetimleri eklenmez. Statik başlatmanın, statik alanlara erişilmeden önce ancak statik bir yöntem veya örnek oluşturucu çağrılmadan önce gerçekleşmesi garanti edilir. Statik başlatmanın türündeki bir değişken bildirildikten sonra herhangi bir zamanda gerçekleşebileceğini unutmayın.

Statik oluşturucu denetimleri performansı düşürebilir. Genellikle statik oluşturucu yalnızca statik alanları başlatmak için kullanılır; bu durumda statik bir alana ilk erişimden önce yalnızca statik başlatmanın gerçekleştiğinden emin olmanız gerekir. Davranış beforefieldinit , bunlar ve diğer türlerin çoğu için uygundur. Yalnızca statik başlatma genel durumu etkilediğinde ve aşağıdakilerden biri doğru olduğunda uygun değildir:

  • Genel durum üzerindeki etkisi pahalıdır ve tür kullanılmadıysa gerekli değildir.

  • Genel durum etkilerine, türündeki statik alanlara erişmeden erişilebilir.

İhlalleri düzeltme

Bu kural ihlalini düzeltmek için bildirildiğinde, tüm statik veriyi başlatın ve statik oluşturucuyu kaldırın.

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

Aşağıdakilerden biri geçerliyse, bu kuraldan bir uyarıyı engellemek güvenlidir:

  • Performans önemli değildir.
  • Statik başlatmanın neden olduğu genel durum değişiklikleri pahalıdır veya türün statik bir yöntemi çağrılmadan veya türün bir örneği oluşturulmadan önce gerçekleşmesi garanti edilmelidir.

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

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.CA1810.severity = none

Daha fazla bilgi için bkz . Kod analizi uyarılarını gizleme.

Örnek

Aşağıdaki örnekte, StaticConstructorkuralı ihlal eden bir türü ve kuralı karşılamak için statik oluşturucuyu satır içi başlatma ile değiştiren bir türü NoStaticConstructorgösterilir.

public class StaticConstructor
{
    static int someInteger;
    static string? resourceString;

    static StaticConstructor()
    {
        someInteger = 3;
        ResourceManager stringManager =
           new ResourceManager("strings", Assembly.GetExecutingAssembly());
        resourceString = stringManager.GetString("string");
    }

    public void Print()
    {
        Console.WriteLine(someInteger);
    }
}

public class NoStaticConstructor
{
    static int someInteger = 3;
    static string? resourceString = InitializeResourceString();

    static string? InitializeResourceString()
    {
        ResourceManager stringManager =
           new ResourceManager("strings", Assembly.GetExecutingAssembly());
        return stringManager.GetString("string");
    }

    public void Print()
    {
        Console.WriteLine(someInteger);
    }
}
Imports System
Imports System.Resources

Namespace ca1810

    Public Class StaticConstructor

        Shared someInteger As Integer
        Shared resourceString As String

        Shared Sub New()

            someInteger = 3
            Dim stringManager As New ResourceManager("strings",
            System.Reflection.Assembly.GetExecutingAssembly())
            resourceString = stringManager.GetString("string")

        End Sub

    End Class


    Public Class NoStaticConstructor

        Shared someInteger As Integer = 3
        Shared resourceString As String = InitializeResourceString()

        Private Shared Function InitializeResourceString()

            Dim stringManager As New ResourceManager("strings",
            System.Reflection.Assembly.GetExecutingAssembly())
            Return stringManager.GetString("string")

        End Function

    End Class

End Namespace

sınıfı için CIL tanımında bayrağının eklenmesine beforefieldinit dikkat edin NoStaticConstructor .

.class public auto ansi StaticConstructor
extends [mscorlib]System.Object
{
} // end of class StaticConstructor

.class public auto ansi beforefieldinit NoStaticConstructor
extends [mscorlib]System.Object
{
} // end of class NoStaticConstructor