Looking for .net Keywords? Try Ask4Keywords

.NET Framework Использовать SafeHandle при обертке неуправляемых ресурсов


пример

При написании оберток для неуправляемых ресурсов вы должны подклассифицировать SafeHandle а не пытаться самостоятельно реализовать IDisposable и финализатор. Подкласс SafeHandle должен быть как можно более малым и простым, чтобы свести к минимуму вероятность утечки рукоятки. Вероятно, это означает, что ваша реализация SafeHandle будет внутренней деталью реализации класса, который обертывает его, чтобы предоставить полезный API. Этот класс гарантирует, что даже если программа утечки вашего экземпляра SafeHandle , ваш неуправляемый дескриптор будет выпущен.

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;
    }
}

Отказ от ответственности. Этот пример представляет собой попытку показать, как защитить управляемый ресурс с помощью SafeHandle который реализует IDisposable для вас и соответствующим образом настраивает финализаторы. Это очень надуманно и, вероятно, бессмысленно выделять кусок памяти таким образом.