CA1001: Typer som äger disponibla fält ska vara disponibla
Property | Värde |
---|---|
Regel-ID | CA1001 |
Title | Typer som äger disponibla fält ska vara disponibla |
Kategori | Designa |
Korrigeringen är icke-bakåtkompatibel | Icke-icke-bakåtkompatibel – Om typen inte visas utanför sammansättningen. Icke-bakåtkompatibel – Om typen är synlig utanför sammansättningen. |
Aktiverad som standard i .NET 9 | Nej |
Orsak
En klass deklarerar och implementerar ett instansfält som är en System.IDisposable typ och klassen implementerar IDisposableinte .
Som standard analyserar den här regeln hela kodbasen, men detta kan konfigureras.
Regelbeskrivning
En klass som deklarerar ett IDisposable fält äger indirekt en ohanterad resurs. Klassen bör implementera IDisposable gränssnittet för att ta bort den ohanterade resurs som den äger när resursen inte längre används. Om klassen inte direkt äger några ohanterade resurser bör den inte implementera en finalizer.
Den här regeln respekterar typer som implementeras System.IAsyncDisposable som engångstyper.
Så här åtgärdar du överträdelser
Om du vill åtgärda en överträdelse av den här regeln implementerar du IDisposable gränssnittet. IDisposable.Dispose I -metoden anropar Dispose du metoden för fältets typ.
När du ska ignorera varningar
I allmänhet ska du inte ignorera en varning från den här regeln. Det är okej att ignorera varningen när ägarskapet för fältet inte innehas av den innehållande typen.
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 CA1001
// The code that's violating the rule is on this line.
#pragma warning restore CA1001
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.CA1001.severity = none
Mer information finns i Så här utelämnar du kodanalysvarningar.
Konfigurera kod för analys
Använd följande alternativ för att konfigurera vilka delar av kodbasen som regeln ska köras på.
Dessa alternativ kan konfigureras för just den här regeln, för alla regler som den gäller för eller för alla regler i den här kategorin (design) som den gäller för. Mer information finns i Konfigurationsalternativ för kodkvalitetsregel.
Exkludera specifika symboler
Du kan exkludera specifika symboler, till exempel typer och metoder, från analys. Om du till exempel vill ange att regeln inte ska köras på någon kod inom typer med namnet MyType
lägger du till följande nyckel/värde-par i en .editorconfig-fil i projektet:
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType
Tillåtna symbolnamnformat i alternativvärdet (avgränsade med |
):
- Endast symbolnamn (innehåller alla symboler med namnet, oavsett vilken typ eller namnrymd som innehåller).
- Fullständigt kvalificerade namn i symbolens dokumentations-ID-format. Varje symbolnamn kräver ett symboltypprefix, till exempel
M:
för metoder,T:
för typer ochN:
för namnområden. .ctor
för konstruktorer och.cctor
statiska konstruktorer.
Exempel:
Alternativvärde | Sammanfattning |
---|---|
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType |
Matchar alla symboler med namnet MyType . |
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType1|MyType2 |
Matchar alla symboler med namnet antingen MyType1 eller MyType2 . |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS.MyType.MyMethod(ParamType) |
Matchar en specifik metod MyMethod med den angivna fullständigt kvalificerade signaturen. |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType) |
Matchar specifika metoder MyMethod1 och MyMethod2 med respektive fullständigt kvalificerade signaturer. |
Exkludera specifika typer och deras härledda typer
Du kan exkludera specifika typer och deras härledda typer från analys. Om du till exempel vill ange att regeln inte ska köras på några metoder inom typer som heter MyType
och deras härledda typer lägger du till följande nyckel/värde-par i en .editorconfig-fil i projektet:
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType
Tillåtna symbolnamnformat i alternativvärdet (avgränsade med |
):
- Skriv endast namn (innehåller alla typer med namnet, oavsett vilken typ eller namnrymd som innehåller).
- Fullständigt kvalificerade namn i symbolens dokumentations-ID-format, med ett valfritt
T:
prefix.
Exempel:
Alternativvärde | Sammanfattning |
---|---|
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType |
Matchar alla typer med namnet MyType och alla deras härledda typer. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType1|MyType2 |
Matchar alla typer med namnet antingen MyType1 eller MyType2 och alla deras härledda typer. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS.MyType |
Matchar en specifik typ MyType med ett angivet fullständigt kvalificerat namn och alla dess härledda typer. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS1.MyType1|M:NS2.MyType2 |
Matchar specifika typer MyType1 och MyType2 med respektive fullständigt kvalificerade namn och alla deras härledda typer. |
Exempel
I följande exempel visas en klass som bryter mot regeln och en klass som uppfyller regeln genom att implementera IDisposable. Klassen implementerar inte någon finalator eftersom klassen inte äger några ohanterade resurser direkt.
Imports System
Imports System.IO
Namespace ca1001
' This class violates the rule.
Public Class NoDisposeMethod
Dim newFile As FileStream
Sub New()
newFile = New FileStream("c:\temp.txt", FileMode.Open)
End Sub
End Class
' This class satisfies the rule.
Public Class HasDisposeMethod
Implements IDisposable
Dim newFile As FileStream
Sub New()
newFile = New FileStream("c:\temp.txt", FileMode.Open)
End Sub
Protected Overridable Overloads Sub Dispose(disposing As Boolean)
If disposing Then
' dispose managed resources
newFile.Close()
End If
' free native resources
End Sub 'Dispose
Public Overloads Sub Dispose() Implements IDisposable.Dispose
Dispose(True)
GC.SuppressFinalize(Me)
End Sub 'Dispose
End Class
End Namespace
// This class violates the rule.
public class NoDisposeMethod
{
FileStream _newFile;
public NoDisposeMethod()
{
_newFile = new FileStream(@"c:\temp.txt", FileMode.Open);
}
}
// This class satisfies the rule.
public class HasDisposeMethod : IDisposable
{
FileStream _newFile;
public HasDisposeMethod()
{
_newFile = new FileStream(@"c:\temp.txt", FileMode.Open);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
// Dispose managed resources.
_newFile.Close();
}
// Free native resources.
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
Relaterade regler
- CA2213: Disponibla fält ska kasseras
- CA2216: Engångstyper bör deklarera finalator
- CA2215: Kassera metoder ska anropa basklassens bortskaffning