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

时间:2012-08-25 23:52:14

标签: c# .net dispose idisposable

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

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

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

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

4 个答案:

答案 0 :(得分:46)

在卸载托管您的类的应用程序域之前,不会对您的类的静态变量进行垃圾回收。不会调用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;
        }
    }
}

答案 1 :(得分:0)

您应手动处理此对象,无法为静态资源创建“终结器”。

答案 2 :(得分:0)

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
    }
}

答案 3 :(得分:-1)

如果您真的要有静态成员来保留对非托管对象的引用 只需创建一种处理非托管对象的方法,然后“强制”消费者在退出时使用它即可。

通过“强制”,我的意思是用一段说明您何时使用此“ dispose”方法的“何时”和“为什么”的文档。 如果您是唯一的使用者(或您的代码...),或者计划分发您的课程,请这样做。 还尝试使用某种描述性的名称(针对该“ dispose”方法),例如“ DisposeStatics”,“ AlwaysDispose”,“ DisposeAtEnd”等。