CA2211: Niet-constante velden mogen niet zichtbaar zijn

Eigenschap Waarde
Regel-id CA2211
Titel Niet-constante velden mogen niet zichtbaar zijn
Categorie Gebruik
Fix kan brekend of niet-brekend zijn Onderbreking
Standaard ingeschakeld in .NET 10 Als suggestie
Toepasselijke talen C# en Visual Basic

Oorzaak

Een openbaar of beschermd statisch veld is niet constant noch is het alleen lezen.

Beschrijving van regel

Statische velden die noch constanten, noch readonly zijn, zijn niet thread-veilig. Toegang tot een dergelijk veld moet zorgvuldig worden beheerd en vereist geavanceerde programmeertechnieken voor het synchroniseren van de toegang tot het klasseobject. Omdat dit moeilijke vaardigheden zijn om te leren en een dergelijk object te testen een eigen uitdaging vormt, kunnen statische velden het beste worden gebruikt om gegevens op te slaan die niet veranderen. Deze regel is van toepassing op bibliotheken; toepassingen mogen geen velden beschikbaar maken.

Hoe schendingen op te lossen

Als u een schending van deze regel wilt oplossen, moet u het statische veld constant of alleen-lezen maken. Als dit niet mogelijk is, herontwerp dan het type om een alternatief mechanisme te gebruiken, zoals een draadveilige eigenschap die de toegang tot het onderliggende veld beheert. Houd er rekening mee dat problemen zoals vergrendelingsconflicten en deadlocks van invloed kunnen zijn op de prestaties en het gedrag van de bibliotheek.

Wanneer waarschuwingen onderdrukken

Het is veilig om een waarschuwing van deze regel te onderdrukken als u een toepassing ontwikkelt en daarom volledige controle hebt over de toegang tot het type dat het statische veld bevat. Bibliotheekontwerpers mogen geen waarschuwing van deze regel onderdrukken; het gebruik van niet-constante statische velden kan het lastig maken om de bibliotheek goed te gebruiken voor ontwikkelaars.

Een waarschuwing onderdrukken

Als u slechts één schending wilt onderdrukken, voegt u preprocessorrichtlijnen toe aan uw bronbestand om de regel uit te schakelen en vervolgens opnieuw in te schakelen.

#pragma warning disable CA2211
// The code that's violating the rule is on this line.
#pragma warning restore CA2211

Als u de regel voor een bestand, map of project wilt uitschakelen, stelt u de ernst none ervan in op het configuratiebestand.

[*.{cs,vb}]
dotnet_diagnostic.CA2211.severity = none

Zie voor meer informatie Hoe codeanalysewaarschuwingen te onderdrukken.

Voorbeeld

In het volgende voorbeeld ziet u een type dat deze regel schendt.


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;
}