.NET Framework Utilisez SafeHandle lorsque vous encapsulez des ressources non managées


Exemple

Lorsque vous écrivez des wrappers pour des ressources non gérées, vous devez sous- SafeHandle plutôt que d'essayer d'implémenter IDisposable et un finaliseur vous-même. Votre sous-classe SafeHandle doit être aussi petite et simple que possible pour minimiser les risques de fuite. Cela signifie probablement que votre implémentation SafeHandle serait un détail d'implémentation interne d'une classe qui l'enveloppe pour fournir une API utilisable. Cette classe garantit que, même si un programme SafeHandle votre instance SafeHandle , votre SafeHandle non géré est libéré.

using System.Runtime.InteropServices;

class MyHandle : SafeHandle
{
    public override bool IsInvalid => handle == IntPtr.Zero;
    public MyHandle() : base(IntPtr.Zero, true)
    { }

    public MyHandle(int length) : this()
    {
        SetHandle(Marshal.AllocHGlobal(length));
    }

    protected override bool ReleaseHandle()
    {
        Marshal.FreeHGlobal(handle);
        return true;
    }
}

Disclaimer: Cet exemple est une tentative pour montrer comment protéger une ressource gérée avec SafeHandle qui implémente IDisposable pour vous et qui configure les finaliseurs de manière appropriée. C'est très artificiel et probablement inutile d'allouer un morceau de mémoire de cette manière.