我读了很多关于C#中的终结器和IDisposable的内容。当我终于从终结器和IDisposable的巨大混乱中清醒过来时,突然,不知从哪里,出现了SafeHandle的事情。我的信念再次完全动摇了。我应该用什么?
发布于 2011-10-18 12:08:04
只有在处理Win32互操作调用时,SafeHandle才有用。在Win32中,大多数东西都由"handles“表示。这包括Windows、Mutexes等,因此.NET SafeHandle使用可处理模式来确保Win32句柄被正确关闭。
因此,如果您正在使用Win32互操作调用并获取Win32句柄,那么请使用SafeHandle。对于您自己的对象,您将坚持使用IDisposable和终结器。
发布于 2011-10-18 13:42:01
您可以/应该对任何可以表示为IntPtr的未管理资源使用SafeHandle,即Win32句柄、由非托管代码分配的内存等。当SafeHandle不适合,但您仍然需要处理非托管资源时,请考虑从CriticalFinalizerObject继承您自己的类似SafeHandle的类。
在所有其他情况下(即处理托管资源),实现IDisposable。在大多数情况下,你不需要终结器,当终结器被调用时,大多数托管资源将不可用,因此在那里将没有什么可做的。
发布于 2011-10-18 21:20:37
在大多数情况下,我的建议是假装没有终结器这样的东西,但要100%确定任何创建的IDisposable对象都会被销毁。即使终结器是以100%的最佳方式编写的,正确处理一半对象并让终结器处理另一半的代码也不会像正确处理所有对象而不使用终结器的代码那样好。虽然通常从不运行的终结器对性能的影响确实不是太糟糕,但终结器很难正确编写,如果它们的代码或使用它们的代码编写得不够完美,它们可能会导致Heisenbugs。此外,终结器的成功实现通常需要创建一个或多个WeakHandles,其唯一目的是支持终结器。
也许最终定稿的安全网是值得的,但成本可能是相当可观的,并且安全网并不像人们想要的那样可靠。
https://stackoverflow.com/questions/7802258
复制相似问题