CA2211: Icke-konstanta fält ska inte vara synliga
Property | Värde |
---|---|
Regel-ID | CA2211 |
Title | Icke-konstanta fält ska inte vara synliga |
Kategori | Användning |
Korrigeringen är icke-bakåtkompatibel | Brott |
Aktiverad som standard i .NET 9 | Som förslag |
Orsak
Ett offentligt eller skyddat statiskt fält är inte konstant eller skrivskyddat.
Regelbeskrivning
Statiska fält som varken är konstanter eller skrivskyddade är inte trådsäkra. Åtkomst till ett sådant fält måste kontrolleras noggrant och kräver avancerade programmeringstekniker för att synkronisera åtkomsten till klassobjektet. Eftersom det är svåra kunskaper att lära sig, och testning av ett sådant objekt innebär sina egna utmaningar, används statiska fält bäst för att lagra data som inte ändras. Den här regeln gäller för bibliotek. program ska inte exponera några fält.
Så här åtgärdar du överträdelser
Åtgärda ett brott mot den här regeln genom att göra det statiska fältet konstant eller skrivskyddat. Om detta inte är möjligt gör du om typen så att den använder en alternativ mekanism, till exempel en trådsäker egenskap som hanterar trådsäker åtkomst till det underliggande fältet. Tänk på att problem som låskonkurration och dödlägen kan påverka bibliotekets prestanda och beteende.
När du ska ignorera varningar
Det är säkert att ignorera en varning från den här regeln om du utvecklar ett program och därför har fullständig kontroll över åtkomsten till den typ som innehåller det statiska fältet. Biblioteksdesigners bör inte ignorera en varning från den här regeln. Användning av icke-konstanta statiska fält kan göra det svårt för utvecklare att använda biblioteket på rätt sätt.
Ignorera en varning
Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och aktiverar sedan regeln igen.
#pragma warning disable CA2211
// The code that's violating the rule is on this line.
#pragma warning restore CA2211
Om du vill inaktivera regeln för en fil, mapp eller ett projekt anger du dess allvarlighetsgrad till none
i konfigurationsfilen.
[*.{cs,vb}]
dotnet_diagnostic.CA2211.severity = none
Mer information finns i Så här utelämnar du kodanalysvarningar.
Exempel
I följande exempel visas en typ som bryter mot den här regeln.
Imports System
Namespace ca2211
Public Class SomeStaticFields
' Violates rule: AvoidNonConstantStatic;
' the field is public and not a literal.
Public Shared publicField As DateTime = DateTime.Now
' Satisfies rule: AvoidNonConstantStatic.
Public Shared ReadOnly literalField As DateTime = DateTime.Now
' Satisfies rule: NonConstantFieldsShouldNotBeVisible;
' the field is private.
Private Shared privateField As DateTime = DateTime.Now
End Class
End Namespace
public class SomeStaticFields
{
// Violates rule: AvoidNonConstantStatic;
// the field is public and not a literal.
static public DateTime publicField = DateTime.Now;
// Satisfies rule: AvoidNonConstantStatic.
public static readonly DateTime literalField = DateTime.Now;
// Satisfies rule: NonConstantFieldsShouldNotBeVisible;
// the field is private.
static DateTime privateField = DateTime.Now;
}