CA1063: Az IDisposable helyes implementálása
Tulajdonság | Érték |
---|---|
Szabályazonosító | CA1063 |
Cím | Az IDisposable helyes implementálása |
Kategória | Design |
A javítás kompatibilitástörő vagy nem törik | Nem törés |
Alapértelmezés szerint engedélyezve a .NET 8-ban | Nem |
Ok
A System.IDisposable felület nincs megfelelően implementálva. Ennek lehetséges okai a következők:
- IDisposable az osztályban van újrarendelve.
Finalize
ismét felül van bírálva.Dispose()
felül van bírálva.- A
Dispose()
módszer nem nyilvános, lezárt vagy elnevezett. Dispose(bool)
nem védett, nem virtuális vagy nem védett.- A nem leválasztott típusok esetén
Dispose()
a hívásnak kell lennieDispose(true)
. - A lezáratlan típusok esetében az
Finalize
implementáció nem hívja meg sem az alaposztály döntősét, sem mindkettőtDispose(bool)
.
Ezen minták bármelyikének megsértése a CA1063 figyelmeztetést váltja ki.
Minden, az IDisposable interfészt deklaráló és megvalósító el nem bontott típusnak saját protected virtual void Dispose(bool)
módszert kell biztosítania. Dispose()
kell hívni Dispose(true)
, és a véglegesítőnek kell hívnia Dispose(false)
. Ha létrehoz egy lezáratlan típust, amely deklarálja és megvalósítja az IDisposable interfészt, meg kell határoznia Dispose(bool)
és meg kell hívnia. További információ: A nem felügyelt erőforrások törlése (.NET-útmutató) és az Elidegenítési módszer implementálása.
Ez a szabály alapértelmezés szerint csak külsőleg látható típusokat tekint meg, de ez konfigurálható.
Szabály leírása
Minden IDisposable típusnak helyesen kell implementálnia az Elidegenítési mintát .
Szabálysértések kijavítása
Vizsgálja meg a kódot, és állapítsa meg, hogy az alábbi feloldások közül melyik fogja kijavítani ezt a szabálysértést:
Távolítsa el IDisposable a típus által implementált interfészek listájából, és bírálja felül helyette az Elvetés alaposztály implementációját.
Távolítsa el a véglegesítőt a típusból, bírálja felül az Dispose (bool disposing) parancsot, és helyezze a véglegesítési logikát arra a kódútvonalra, ahol a "kiírás" hamis.
Felülbírálja az Elidegenítést (bool disposing), és helyezze az elidegenítési logikát arra a kódútvonalra, ahol a "megsemmisítés" igaz.
Győződjön meg arról, hogy a Dispose() nyilvános és lezárt.
Nevezze át az elidegenítési módszert a Megsemmisítés gombra, és győződjön meg arról, hogy nyilvánosként és lezártként van deklarálva.
Győződjön meg arról, hogy az Dispose(bool) védett, virtuális és feloldott állapotúként van deklarálva.
Módosítsa az Elidegenítés() elemet úgy, hogy meghívja az Dispose(true) parancsot, majd hívja SuppressFinalize meg az aktuális objektumpéldányt (
this
vagyMe
a Visual Basicet), majd visszatér.Módosítsa a véglegesítőt úgy, hogy meghívja az Dispose(false) függvényt, majd visszatér.
Ha létrehoz egy lezáratlan típust, amely deklarálja és megvalósítja az IDisposable interfészt, győződjön meg arról, hogy a implementáció IDisposable a jelen szakaszban korábban ismertetett mintát követi.
Mikor kell letiltani a figyelmeztetéseket?
Ne tiltsa el a szabály figyelmeztetését.
Megjegyzés:
Ha az alábbiak mindegyike érvényes, a szabály tévesen pozitív figyelmeztetéseket jeleníthet meg:
- A Visual Studio 2022 17.5-ös vagy újabb verzióját használja a .NET SDK egy régebbi verziójával, vagyis a .NET 6-os vagy korábbi verziójával.
- A .NET 6 SDK-ból származó elemzőket vagy az elemzőcsomagok egy régebbi verzióját használja, például a Microsoft.CodeAnalysis.FxCopAnalyzerst.
- A megvalósításhoz
IDispose
attribútumok tartoznak.
Ebben az esetben nyugodtan el lehet tiltani egy hamis pozitív figyelmeztetést. A hamis pozitív értékek a C#-fordító kompatibilitástörő változásának köszönhetők. Fontolja meg egy újabb elemző használatát, amely tartalmazza a hamis pozitív figyelmeztetések javítását. Frissítsen a Microsoft.CodeAnalysis.NetAnalyzers 7.0.0-preview1.22464.1-es vagy újabb verziójára, vagy használja a .NET 7 SDK elemzőit.
Kód konfigurálása elemzéshez
A következő beállítással konfigurálhatja, hogy a kódbázis mely részein futtassa ezt a szabályt.
Ezt a beállítást konfigurálhatja csak ehhez a szabályhoz, az összes szabályhoz, vagy az ebben a kategóriában (Tervezés) szereplő összes szabályhoz, amelyekre vonatkozik. További információ: Kódminőségi szabály konfigurációs beállításai.
Adott API-felületek belefoglalása
A kódbázis azon részeit konfigurálhatja, amelyeken futtathatja ezt a szabályt az akadálymentességük alapján. Ha például meg szeretné adni, hogy a szabály csak a nem nyilvános API-felületen fusson, adja hozzá a következő kulcs-érték párot a projekt egyik .editorconfig fájljához:
dotnet_code_quality.CAXXXX.api_surface = private, internal
Példa pszeudokódra
Az alábbi pszeudokód általános példát mutat be arra, hogyan Dispose(bool)
kell implementálást végrehajtani egy felügyelt és natív erőforrásokat használó osztályban.
public class Resource : IDisposable
{
private bool isDisposed;
private IntPtr nativeResource = Marshal.AllocHGlobal(100);
private AnotherResource managedResource = new AnotherResource();
// Dispose() calls Dispose(true)
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
// The bulk of the clean-up code is implemented in Dispose(bool)
protected virtual void Dispose(bool disposing)
{
if (isDisposed) return;
if (disposing)
{
// free managed resources
managedResource.Dispose();
}
// free native resources if there are any.
if (nativeResource != IntPtr.Zero)
{
Marshal.FreeHGlobal(nativeResource);
nativeResource = IntPtr.Zero;
}
isDisposed = true;
}
// NOTE: Leave out the finalizer altogether if this class doesn't
// own unmanaged resources, but leave the other methods
// exactly as they are.
~Resource()
{
// Finalizer calls Dispose(false)
Dispose(false);
}
}