CA1051: Deklarera inte synliga instansfält

Egenskap Värde
Regel-ID CA1051
Title Deklarera inte synliga instansfält
Kategori Design
Korrigeringen är antingen invasiv eller icke-invasiv Avbrott
Aktiverad som standard i .NET 10 Nej
Tillämpliga språk C# och Visual Basic

Orsak

En typ har ett instansfält som inte är privat.

Som standard tittar den här regeln bara på externt synliga typer, men det kan konfigureras.

Regelbeskrivning

Den primära användningen av ett fält bör vara som en implementeringsinformation. Fälten ska vara private eller internal och ska exponeras med hjälp av egenskaper. Det är lika enkelt att komma åt en egenskap som det är att komma åt ett fält, och koden i en egenskaps åtkomstmetoder kan ändras när funktionerna i typen utökas utan att några bakåtkompatibla ändringar införs.

Egenskaper som bara returnerar värdet för ett privat eller internt fält är optimerade för att utföras i nivå med åtkomsten till ett fält. prestandavinsten från att använda externt synliga fält i stället för egenskaper är minimal. Externt synliga refererar till public, protected, och protected internal (Public, Protected, och Protected Friend i Visual Basic) åtkomsträttigheter.

Dessutom kan offentliga fält inte skyddas av Link-krav. (Länkkrav gäller inte för .NET Core-appar.)

Så här åtgärdar du överträdelser

Åtgärda ett brott mot den här regeln genom att göra fältet private eller internal och låta det exponeras med hjälp av en externt synlig egenskap.

När du ska ignorera varningar

Utelämna bara den här varningen om du är säker på att konsumenterna behöver direkt åtkomst till fältet. För de flesta program ger exponerade fält inte prestanda- eller underhållsfördelar jämfört med egenskaper.

Konsumenter kan behöva fältåtkomst i följande situationer:

  • I ASP.NET-innehållskontroller för webbformulär.
  • När målplattformen använder ref för att ändra fält, till exempel MVVM-ramverk (model-view-viewmodel) för WPF och UWP.

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 CA1051
// The code that's violating the rule is on this line.
#pragma warning restore CA1051

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.CA1051.severity = none

Mer information finns i Så här utelämnar du kodanalysvarningar.

Inkludera eller exkludera API:er

Använd följande alternativ för att konfigurera vilka delar av kodbasen som regeln ska köras på.

Du kan konfigurera dessa alternativ för just den här regeln, för alla regler som de gäller för eller för alla regler i den här kategorin (Design) som de gäller för. Mer information finns i Konfigurationsalternativ för kodkvalitetsregel.

Inkludera specifika ytor för API:er

Du kan konfigurera vilka delar av kodbasen som ska köra den här regeln baserat på deras tillgänglighet genom att ange alternativet api_surface. Om du till exempel vill ange att regeln endast ska köras mot den icke-offentliga API-ytan lägger du till följande nyckel/värde-par i en .editorconfig-fil i projektet:

dotnet_code_quality.CAXXXX.api_surface = private, internal

Anteckning

Ersätt den XXXX delen av CAXXXX med ID:t för den tillämpliga regeln.

Exkludera strukturer

Du kan undanta struct fält (Structure i Visual Basic) från att analyseras.

dotnet_code_quality.ca1051.exclude_structs = true

Exempel

I följande exempel visas en typ (BadPublicInstanceFields) som bryter mot den här regeln. GoodPublicInstanceFields visar den korrigerade koden.

public class BadPublicInstanceFields
{
    // Violates rule DoNotDeclareVisibleInstanceFields.
    public int instanceData = 32;
}

public class GoodPublicInstanceFields
{
    public int InstanceData { get; set; } = 32;
}

Se även