CA1001: Typy, które posiadają pola usuwalne, powinny być usuwalne
Właściwości | Wartość |
---|---|
Identyfikator reguły | CA1001 |
Tytuł | Typy, do których należą pola możliwe do likwidacji, powinny być możliwe do likwidacji |
Kategoria | Projekt |
Poprawka powodująca niezgodność lub niezgodność | Niezgodność — jeśli typ nie jest widoczny poza zestawem. Niezgodność — jeśli typ jest widoczny poza zestawem. |
Domyślnie włączone na platformie .NET 9 | Nie. |
Przyczyna
Klasa deklaruje i implementuje pole wystąpienia, które jest typem System.IDisposable , a klasa nie implementuje IDisposableklasy .
Domyślnie ta reguła analizuje całą bazę kodu, ale można to skonfigurować.
Opis reguły
Klasa, która deklaruje IDisposable pole pośrednio jest właścicielem niezarządzanego zasobu. Klasa powinna zaimplementować IDisposable interfejs do usuwania niezarządzanego zasobu, który jest właścicielem, gdy zasób nie jest już używany. Jeśli klasa nie jest bezpośrednio właścicielem żadnych niezarządzanych zasobów, nie powinna implementować finalizatora.
Ta reguła uwzględnia typy implementowania System.IAsyncDisposable jako typy jednorazowe.
Jak naprawić naruszenia
Aby naprawić naruszenie tej reguły, zaimplementuj IDisposable interfejs. W metodzie IDisposable.Dispose wywołaj metodę Dispose typu pola.
Kiedy pomijać ostrzeżenia
Ogólnie rzecz biorąc, nie pomijaj ostrzeżenia z tej reguły. Można pominąć ostrzeżenie, gdy własność usuwania pola nie jest przechowywana przez typ zawierający.
Pomijanie ostrzeżenia
Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.
#pragma warning disable CA1001
// The code that's violating the rule is on this line.
#pragma warning restore CA1001
Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none
w pliku konfiguracji.
[*.{cs,vb}]
dotnet_diagnostic.CA1001.severity = none
Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.
Konfigurowanie kodu do analizowania
Użyj poniższych opcji, aby skonfigurować, które części bazy kodu mają być uruchamiane w tej regule.
Te opcje można skonfigurować tylko dla tej reguły, dla wszystkich reguł, których dotyczy, lub dla wszystkich reguł w tej kategorii (Projekt), do których ma ona zastosowanie. Aby uzyskać więcej informacji, zobacz Opcje konfiguracji reguły jakości kodu.
Wykluczanie określonych symboli
Z analizy można wykluczyć określone symbole, takie jak typy i metody. Aby na przykład określić, że reguła nie powinna być uruchamiana w żadnym kodzie w typach o nazwie MyType
, dodaj następującą parę klucz-wartość do pliku editorconfig w projekcie:
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType
Dozwolone formaty nazw symboli w wartości opcji (oddzielone przez |
):
- Tylko nazwa symbolu (zawiera wszystkie symbole o nazwie, niezależnie od typu zawierającego lub przestrzeni nazw).
- W pełni kwalifikowane nazwy w formacie identyfikatora dokumentacji symbolu. Każda nazwa symboli wymaga prefiksu typu symboli, takiego jak
M:
metody,T:
dla typów iN:
przestrzeni nazw. .ctor
dla konstruktorów i.cctor
konstruktorów statycznych.
Przykłady:
Wartość opcji | Podsumowanie |
---|---|
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType |
Pasuje do wszystkich symboli o nazwie MyType . |
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType1|MyType2 |
Pasuje do wszystkich symboli o nazwie MyType1 lub MyType2 . |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS.MyType.MyMethod(ParamType) |
Pasuje do określonej metody MyMethod z określonym w pełni kwalifikowanym podpisem. |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType) |
Pasuje do określonych metod MyMethod1 i MyMethod2 z odpowiednimi w pełni kwalifikowanymi podpisami. |
Wykluczanie określonych typów i ich typów pochodnych
Z analizy można wykluczyć określone typy i ich typy pochodne. Aby na przykład określić, że reguła nie powinna być uruchamiana na żadnych metodach w typach nazwanych MyType
i ich typach pochodnych, dodaj następującą parę klucz-wartość do pliku .editorconfig w projekcie:
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType
Dozwolone formaty nazw symboli w wartości opcji (oddzielone przez |
):
- Nazwa typu (zawiera tylko wszystkie typy o nazwie, niezależnie od typu zawierającego lub przestrzeni nazw).
- W pełni kwalifikowane nazwy w formacie identyfikatora dokumentacji symbolu z opcjonalnym
T:
prefiksem.
Przykłady:
Wartość opcji | Podsumowanie |
---|---|
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType |
Pasuje do wszystkich typów nazwanych MyType i wszystkich ich typów pochodnych. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType1|MyType2 |
Dopasuje wszystkie typy o nazwie MyType1 lub MyType2 i wszystkie ich typy pochodne. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS.MyType |
Pasuje do określonego typu MyType z daną w pełni kwalifikowaną nazwą i wszystkimi jego typami pochodnymi. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS1.MyType1|M:NS2.MyType2 |
Pasuje do określonych typów MyType1 i MyType2 z odpowiednimi w pełni kwalifikowanymi nazwami i wszystkimi ich typami pochodnymi. |
Przykład
W poniższym przykładzie pokazano klasę, która narusza regułę i klasę spełniającą wymagania reguły przez zaimplementowanie IDisposableklasy . Klasa nie implementuje finalizatora, ponieważ klasa nie jest bezpośrednio właścicielem żadnych niezarządzanych zasobów.
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);
}
}
Powiązane reguły
- CA2213: Pola możliwe do likwidacji powinny zostać zlikwidowane
- CA2216: Typy możliwe do likwidacji powinny deklarować finalizator
- CA2215: Metody Dispose powinny wywoływać metodę Dispose klasy podstawowej