IDisposable шаблон, SafeFileHandle является неуправляемым ресурсом? - PullRequest
0 голосов
/ 03 февраля 2020

Возьмем следующий фрагмент шаблона IDisposable, созданного Resharper:

[NotNull]
private SafeFileHandle Handle { get; }

#region IDisposable

private bool IsDisposed { get; set; }

public void Dispose()
{
    Dispose(true);
    GC.SuppressFinalize(this);
}

private void ReleaseUnmanagedResources()
{
    // TODO release unmanaged resources here
}

private void Dispose(bool disposing)
{
    if (IsDisposed)
        return;

    ReleaseUnmanagedResources();

    if (disposing)
        Handle.Dispose();

    IsDisposed = true;
}

~Whatever()
{
    Dispose(false);
}

Resharper рассматривает SafeFileHandle как управляемый ресурс, но этот дескриптор относится к неуправляемому ресурсу (CreateFile).

Вопрос:

Должен ли SafeFileHandle рассматриваться как управляемый или неуправляемый ресурс при его утилизации?

1 Ответ

1 голос
/ 03 февраля 2020

Все C# классы и структуры являются управляемыми ресурсами 1 .

На неуправляемые ресурсы обычно указывает IntPtr или что-то подобное. Обычно вам нужно сделать что-то преднамеренное, чтобы получить в свое распоряжение (например, P / Invoking какого-либо нативного метода или использовать один из методов на Marshal).

SafeFileHandle является подклассом SafeHandle, который специально создан для упаковки неуправляемых ресурсов. SafeHandle определяет свой собственный финализатор, который при необходимости освобождает неуправляемый ресурс подходящим образом.


Это хороший совет, чтобы никогда не владел своими собственными неуправляемыми ресурсами, а вместо этого всегда используйте подкласс SafeHandle / CriticalFinalizerObject для управления ими.

Это позволяет избежать одной из больших ловушек P / Invoke, а также означает, что вам не нужно реализовывать полную IDisposable шаблон в вашем коде: вам нужно только определить Dispose() метод, который вызывает Dispose() на вашем SafeHandles, и не нужно реализовывать финализатор.

(Некоторым людям может потребоваться отклониться из-за соображений производительности, но таких людей мало и далеко друг от друга)


1 Generi c типы с ограничением unmanaged в стороне ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...