Share via


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 Bryta
Aktiverad som standard i .NET 8 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;
}