Megosztás a következőn keresztül:


CA2211: A nem állandó mezők nem lehetnek láthatók

Tulajdonság Érték
Szabályazonosító CA2211
Cím A nem állandó mezők nem lehetnek láthatók
Kategória Használat
A javítás kompatibilitástörő vagy nem törik Törés
Alapértelmezés szerint engedélyezve a .NET 8-ban Javaslatként

Ok

A nyilvános vagy védett statikus mező nem állandó, és nem is írásvédett.

Szabály leírása

A nem állandó vagy írásvédett statikus mezők nem szálbiztosak. Az ilyen mezőkhöz való hozzáférést gondosan szabályozni kell, és fejlett programozási technikákat igényel az osztályobjektumhoz való hozzáférés szinkronizálásához. Mivel ezeket a képességeket nehéz elsajátítani, és az ilyen objektumok tesztelése saját kihívást jelent, a statikus mezők a legjobban olyan adatok tárolására használhatók, amelyek nem változnak. Ez a szabály a kódtárakra vonatkozik; az alkalmazások nem tehetnek közzé mezőket.

Szabálysértések kijavítása

A szabály megsértésének kijavításához állítsa állandóvá vagy írásvédetté a statikus mezőt. Ha ez nem lehetséges, tervezze át a típust úgy, hogy egy alternatív mechanizmust, például egy szálbiztos tulajdonságot használjon, amely kezeli a szálbiztos hozzáférést az alapul szolgáló mezőhöz. Tudja meg, hogy az olyan problémák, mint a zárolási versengés és a holtpontok, hatással lehetnek a kódtár teljesítményére és viselkedésére.

Mikor kell letiltani a figyelmeztetéseket?

Ha egy alkalmazást fejleszt, és ezért teljes körű hozzáféréssel rendelkezik a statikus mezőt tartalmazó típushoz, nyugodtan letilthatja a szabály figyelmeztetését. A kódtár tervezőinek nem szabad letiltania a szabály figyelmeztetését; a nem állandó statikus mezők használata megnehezítheti a kódtár megfelelő használatát.

Figyelmeztetés mellőzése

Ha csak egyetlen szabálysértést szeretne letiltani, adjon hozzá előfeldolgozási irányelveket a forrásfájlhoz a szabály letiltásához és újbóli engedélyezéséhez.

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

Ha le szeretné tiltani egy fájl, mappa vagy projekt szabályát, állítsa annak súlyosságát none a konfigurációs fájlban.

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

További információ: Kódelemzési figyelmeztetések letiltása.

Példa

Az alábbi példa egy olyan típust mutat be, amely megsérti ezt a szabályt.


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