Share via


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 lennie Dispose(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őt Dispose(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 (thisvagy Me 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);
    }
}

Kapcsolódó információk