Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
| Egenskap | Värde |
|---|---|
| Regel-ID | CA2207 |
| Title | Initiera värdetypens statiska fält inline |
| Kategori | Användning |
| Korrigeringen är antingen invasiv eller icke-invasiv | Oumbrytbar |
| Aktiverad som standard i .NET 10 | Nej |
| Tillämpliga språk | C# och Visual Basic |
Orsak
En värdetyp deklarerar en explicit statisk konstruktor.
Regelbeskrivning
När en värdetyp deklareras genomgår den en standardinitiering där alla fält av värdetyp är inställda på noll och alla fält av referenstyp anges till null (Nothing i Visual Basic). En explicit statisk konstruktor är bara garanterad att köras innan en instanskonstruktor eller en statisk medlem av typen anropas. Om typen skapas utan att anropa en instanskonstruktor är den statiska konstruktorn därför inte garanterad att köras.
Om all statisk data initieras inline och ingen explicit statisk konstruktor deklareras lägger C#- och Visual Basic-kompilatorerna till beforefieldinit-flagga i CIL-klassdefinitionen. Kompilatorerna lägger också till en privat statisk konstruktor som innehåller den statiska initieringskoden. Den här privata statiska konstruktorn kommer garanterat att köras innan några statiska fält av typen används.
Så här åtgärdar du överträdelser
Åtgärda ett brott mot den här regeln genom att initiera alla statiska data när de deklareras och ta bort den statiska konstruktorn.
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;
// ...
}
När du ska ignorera varningar
Ignorera inte en varning från den här regeln.