C# 自动释放managed resource

来源:互联网 发布:马岛战争 知乎 编辑:程序博客网 时间:2024/05/17 20:33
近来正在研究垃圾收集器,finalizer 和 Dispose 。对某些managed resource的自动释放原理没有搞懂,对managed resource 的定义也不清楚,被微软 的Dispose 建议高糊涂了。请见源码,希望高手指点。
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.IO;

namespace TestDisposeNotCalled {
    
static class Program {
        
/// <summary>
        
/// The main entry point for the application.
        
/// </summary>

        [STAThread]
        
static void Main() {
            B b 
= new B();
        }

        
// b.a.writer is automatically closed?
    }


    
public class A : IDisposable {
        
private StreamWriter writer=null;
        
IDisposable Members
        
public A() {
            writer
=new StreamWriter("a.txt",false);
            writer.AutoFlush 
= true;
            writer.Write(
"In A constructor!");
        }

    }


    
public class B {
        
private A a = new A();
    }

}

当程序运行时,a.txt是不能被wordPad打开,原因是已被另外一个程序打开,(上述代码以写的方式占有a.txt)。当程序结束时,a.txt能被wordPad打开,我认为CLR自动把managed resource (writer)关闭(close). 设置断点于dispose()中,但是程序从未停在断点处,说明dispose 没有被调用,
那么,什么时候writer被关闭?
我们知道finalizer 在对象被收集前会被自动调用,可是无论类A和B都没有finalizer。StreamWriter 我检查了一下,也没有finalizer 或 destrcutor。
望高手指教!

关于Finalizer 调用 Dispose(false)?
见以下代码,摘自msdn,插入writer作为managed object 例子

// Design pattern for a base class.
public class Base: IDisposable
{
   
private StreamWriter writer=null;

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


   
protected virtual void Dispose(bool disposing) 
   
{
      
if (disposing) 
      
{
         
// Free other state (managed objects).
         if(writer !=null)
            writer.Close();          
      }

      
// Free your own state (unmanaged objects).
      
// Set large fields to null.
   }


   
// Use C# destructor syntax for finalization code.
   ~Base()
   
{
      
// Simply call Dispose(false).
      Dispose (false);
   }

}


我没有找到一个很好的 managed object or resourse 的定义,我认为是所有实施IDisposable的类的变量,
可能应是所有带有destructor或finalizer的类的变量。
如果managed object or resourse 是所有实施IDisposable的类的变量,那么finalizer(~Base())在这怪怪的,因为他并没有释放writer 或关闭writer
我觉得finalizer的主要作用是释放 程序员忘记释放的资源,不仅仅是为托管的资源,
因为我们日常编程中涉及大部分是象StreamWriter那样的受托管的资源。

也有可能我了解错了,managed object 应该是带有destructor或finalizer的类的变量。但是StreamWriter并没有
也没有finalizer 或 destrcutor。

那位高手能捐出一段有streamWriter 和 finalizer 的代码!
原创粉丝点击