c#静态成员如何以及何时处置?

Joe*_*Joe 33 .net c# dispose idisposable

我有一个包含大量静态成员的类,其中一些保留对托管和非托管对象的引用.

例如,一旦引用了Type,就会调用静态构造函数,这会导致我的类启动tasks的blockingQueue.例如,当调用其中一个静态方法时会发生这种情况.

我实现了IDisposable,它为我提供了处理我创建的任何实例对象的方法.但是,如果使用者不从我的类创建任何实例对象,则永远不会调用这些方法.

如何以及在何处放置代码来处理由我的类的静态部分维护的引用?我一直认为在释放最后一个实例对象时会发生静态引用资源的处理; 这是我第一次创建一个不会创建任何实例的类.

das*_*ght 51

在卸载托管类的应用程序域之前,不会对类的静态变量进行垃圾回收.该Dispose()方法不会被调用,因为它是一个实例方法,并且您说您不会创建任何类的实例.

如果您想使用该Dispose()方法,请将您的对象设为单个,创建它的一个实例,并在您的应用程序即将退出时显式处理它.

public class MyClass : IDisposable {
    public IList List1<int> {get; private set;}
    public IDictionary<string,string> Dict1 {get; private set;}
    public void Dispose() {
        // Do something here
    }
    public static MyClass Instance {get; private set;}
    static MyClass() {
        Instance = new MyClass();
    }
    public static void DisposeInstance() {
        if (instance != null) {
            Instance.Dispose();
            Instance = null;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Gui*_*jer 8

public class Logger : IDisposable
{

    private string _logDirectory = null;
    private static Logger _instance = null;

    private Logger() : this(ConfigurationManager.AppSettings["LogDirectory"])
    {
        AppDomain.CurrentDomain.ProcessExit += CurrentDomain_ProcessExit;
    }

    private Logger(string logDirectory) 
    {
    } 

    public static Logger Instance
    {
        get
        {
            if (_instance == null)
                _instance = new Logger();
            return _instance;
        }
    }

    private void CurrentDomain_ProcessExit(object sender, EventArgs e)
    {
        Dispose();
    }



    public void Dispose()
    {
        // Dispose unmanaged resources
    }
}
Run Code Online (Sandbox Code Playgroud)