如果不使用using语句,是否会导致IDisposable内存泄漏?

ast*_*ght 3 c# idisposable

如果不使用using语句,是否会导致IDisposable内存泄漏?
如果是这样,如果代码不多,有人可以提供一个内存泄漏示例吗?

sup*_*cat 5

一个正确编写的程序会创建一个实现类型的实例IDisposable,并且在被抛弃后无法明确清除该实例,具体来说,该程序必须确保Dispose在放弃该实例之前对其进行了调用。没有调用无法调用Dispose的类型的任何程序都会被破坏

尽管自动完成可以处理所有事情会很好,但是这是一种非常糟糕的清除机制。它不提供有关顺序,线程上下文,及时性或完成确定性的保证(使用确定性清除时,可以合理地确定如果清除失败,程序似乎无法正常完成;使用终结处理时,程序可能似乎可以正常完成,甚至不尝试清理对象)。

Microsoft曾经曾经打算让每个IDisposable类都可以在被抛弃后对其进行充分的清理,但这根本不切实际。在许多情况下,如果一个类在被放弃后试图自行清理,将会增加大量的复杂性,并且只会将一个具有明显问题且易于追查的坏程序变成一个通常可以工作的坏程序。终结器线程相对于其他线程的计时导致事情以某种意外且不可复制的方式失败时除外。

尽管实施了某些类型,但仍有一些类型IDisposable可以无条件安全地放弃,而在某些情况下可以安全地放弃其他一些类型。最好在难以处理它们的情况下放弃此类类型(例如,因为引用是由多个对象控制的,这些对象由各种线程操纵,并且没有任何一种很好的方式可以使任何特定的对象在持有最后一个幸存者时就知道它)参考),但前提是必须记录一个人相信该行为是安全且适当的理由。但是,在已经接受IDisposable未知血统的对象的情况下,这种行为是不合适的。