我应该处置局部类变量吗?

问题描述 投票:1回答:1

我有一个遗留应用程序,我会不时收到OutOfMemory异常。我正在尝试调试和解决问题。我正在考虑的选项之一是使用Dispose()方法。我知道任何实现IDisposable接口的对象都可以让我在其上调用Dispose()方法,但它也有助于释放资源以将类级别变量设置为null吗?像ArrayListHashtable吗?

我确实在互联网上搜索并找到了一些帖子,但对于是否要null个对象却有些困惑。

我正在尝试的代码

public class RepET : IDisposable
{
    #region Public Member Variables
    public ArrayList country_list;
    public Hashtable data;
    public ArrayList survey_dates;
    public ArrayList city_list;
    public Dictionary<string, Dictionary<string, string>> cityData;
    public Dictionary<string, Dictionary<string, string>> reportCity_list;
    SqlConnection connection = new SqlConnection();
    SqlCommand cmd = new SqlCommand();


    #endregion

    // Flag: Has Dispose already been called?
    bool disposed = false;

    // Protected implementation of Dispose pattern.
    protected void Dispose(bool disposing)
    {
        if (disposed)
            return;

        if (disposing)
        {
            connection.Dispose();
            cmd.Dispose();
            country_list = null;
            data = null;
            survey_dates = null;
            city_list = null;
            cityData = null;
            reportCity_list = null;
        }

        disposed = true;
    }
    public void Dispose()
    {
        Dispose(true);
    }
}

这对内存异常有帮助吗?

c# out-of-memory idisposable
1个回答
0
投票

null的唯一时间设置字段将对垃圾回收有所作为,如果您仍以某种方式仍使RepET实例可访问,在这种情况下,真正的解决方案是:确保[C0 ]实例不再可访问!将字段设置为RepET可以解决实际问题。

使用null来层叠Dispose()connection之类的东西是适当的,但是...我的另一部分认为不存储它们更好的方法,即获得连接按需,并保持cmd完全在其使用位置;类似于:

cmd

但是,真正的窍门是找到持有实例的东西,if才是真正的问题。没有上下文很难评论,但是:事件和静态缓存是开始寻找的好地方。

© www.soinside.com 2019 - 2024. All rights reserved.