.NET的IDisposable模式 意味着 ,如果你写一个终结器,并实现IDisposable,你的终结器需要显式调用Dispose。 这是合乎逻辑的,也是我在罕见情况下一直在做的一件事情。 但是,如果我只是这样做会发生什么: class Foo : IDisposable { public void Dispose(){ CloseSomeHandle(); } } 不要实现一个终结器,或者任何东西。 框架会为我调用Dispose方法吗? 是的,我意识到这听起来很愚蠢,所有的逻辑暗示它不会,但是我总是在头脑后面有两件事让我不确定。 有些人几年前曾经告诉过我,实际上是这样做的,那个人有一个“知道他们的东西”的良好logging。 编译器/框架根据你实现的接口(例如:foreach,扩展方法,基于属性的序列化等等)来执行其他“魔术”的事情,所以这也许是“神奇”的。 虽然我已经阅读了很多关于它的东西,但是有很多暗示的东西,我从来没有能够find这个问题的肯定答案。
我对CLR和GC的工作方式非常着迷(我正在通过C#阅读CLR,Jon Skeet的书籍/文章等来扩展我的知识)。 无论如何,有什么区别说: MyClass myclass = new MyClass(); myclass = null; 或者,通过使MyClass实现IDisposable和析构函数并调用Dispose()? 另外,如果我有一个使用using语句的代码块(例如下面的代码),如果我单步执行代码并退出using块,那么是抛出的对象还是垃圾回收? 如果我在use块中调用Dispose(),会发生什么? using (MyDisposableObj mydispobj = new MyDisposableObj()) { } stream类(例如BinaryWriter)有一个Finalize方法? 我为什么要使用它?