Все C# классы и структуры являются управляемыми ресурсами 1 .
На неуправляемые ресурсы обычно указывает IntPtr
или что-то подобное. Обычно вам нужно сделать что-то преднамеренное, чтобы получить в свое распоряжение (например, P / Invoking какого-либо нативного метода или использовать один из методов на Marshal
).
SafeFileHandle
является подклассом SafeHandle
, который специально создан для упаковки неуправляемых ресурсов. SafeHandle
определяет свой собственный финализатор, который при необходимости освобождает неуправляемый ресурс подходящим образом.
Это хороший совет, чтобы никогда не владел своими собственными неуправляемыми ресурсами, а вместо этого всегда используйте подкласс SafeHandle
/ CriticalFinalizerObject
для управления ими.
Это позволяет избежать одной из больших ловушек P / Invoke, а также означает, что вам не нужно реализовывать полную IDisposable
шаблон в вашем коде: вам нужно только определить Dispose()
метод, который вызывает Dispose()
на вашем SafeHandles
, и не нужно реализовывать финализатор.
(Некоторым людям может потребоваться отклониться из-за соображений производительности, но таких людей мало и далеко друг от друга)
1 Generi c типы с ограничением unmanaged
в стороне ...