Sdílet prostřednictvím


CA2207: Inicializujte statická pole s hodnotovými typy přímo řádkově

Vlastnost Hodnota
ID pravidla CA2207
Název Inicializujte statická pole s typem hodnoty vloženě
Kategorie Využití
Oprava, která může být destruktivní nebo nedestruktivní Nezlomitelný
Povoleno ve výchozím nastavení v .NET 10 Ne
Příslušné jazyky C# a Visual Basic

Příčina

Typ hodnoty deklaruje explicitní statický konstruktor.

Popis pravidla

Když je deklarován typ hodnoty, projde výchozí inicializací, kde jsou všechna pole typu hodnota nastavena na nulu a všechna pole typu odkazu jsou nastavena na null (Nothing v jazyce Visual Basic). U explicitního statického konstruktoru je zaručeno, že se spustí pouze před konstruktorem instance nebo statickým členem typu. Proto, pokud je typ vytvořen bez volání konstruktoru instance, není zaručeno, že bude statický konstruktor spuštěn.

Pokud jsou všechna statická data inicializována inline a není deklarován žádný explicitní statický konstruktor, kompilátory jazyka C# a Visual Basic přidávají příznak beforefieldinit do definice třídy CIL. Kompilátory také přidávají privátní statický konstruktor, který obsahuje kód statické inicializace. Privátní statický konstruktor se zaručeně spustí před jakýmkoliv přístupem ke statickým polím tohoto typu.

Jak opravit porušení

Chcete-li vyřešit porušení tohoto pravidla, inicializujte všechna statická data při jejich deklaraci a odstraňte statický konstruktor.

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;

    // ...
}

Kdy potlačit upozornění

Nepotlačujte upozornění na toto pravidlo.

CA1810: Inicializujte statické pole referenčního typu přímo