Udostępnij za pośrednictwem


CA2207: Inicjuj pola statyczne typu wartościowego inline

Właściwości Wartość
Identyfikator reguły CA2207
Tytuł Inicjuj pola statyczne typu wartości w miejscu
Kategoria Użycie
Poprawka łamiąca lub nienaruszająca Niezgodność
Domyślnie włączone na platformie .NET 10 Nie.
Zastosowane języki C# i Visual Basic

Przyczyna

Typ wartości deklaruje jawny konstruktor statyczny.

Opis reguły

Po zadeklarowaniu typu wartości następuje domyślna inicjalizacja, w której wszystkie pola typu wartości są ustawione na zero, a wszystkie pola typu odwołania są ustawione na null (Nothing w Visual Basic). Jawnie zdefiniowany konstruktor statyczny ma gwarancję uruchomienia tylko przed wywołaniem konstruktora instancji lub statycznego członka typu. W związku z tym, jeśli typ jest tworzony bez wywołania konstruktora instancji, nie ma gwarancji uruchomienia konstruktora statycznego.

Jeśli wszystkie dane statyczne są inicjowane w tekście i nie zadeklarowany jest jawny konstruktor statyczny, kompilatory języka C# i Visual Basic dodają flagę beforefieldinit do definicji klasy CIL. Kompilatory dodają również prywatny konstruktor statyczny zawierający statyczny kod inicjowania. Ten prywatny konstruktor statyczny ma gwarancję uruchomienia przed uzyskaniem dostępu do wszystkich pól statycznych typu.

Jak naprawić naruszenia

Aby naprawić naruszenie tej reguły, zainicjuj wszystkie dane statyczne po zadeklarowaniu i usunięciu konstruktora statycznego.

Example

// This struct violates the rule.
struct BadStruct
{
    private static readonly int s_first;
    private static readonly int s_second;

    static BadStruct()
    {
        s_first = 1;
        s_second = 2;
    }

    // ...
}

// This struct satisfies the rule.
struct GoodStruct
{
    private static readonly int s_first = 1;
    private static readonly int s_second = 2;

    // ...
}

Kiedy pomijać ostrzeżenia

Nie pomijaj ostrzeżeń dla tej reguły.

CA1810: Inicjalizuj pola statyczne typu referencyjnego w linii