解除分配内存,静态类析构函数?

时间:2011-01-13 20:24:11

标签: c# asp.net memory-management

我在我的网站上使用了一个静态类作为我的数据层。在这个类中,我有一个字符串数组,用于存储我以后可以访问的查询信息。这是我班级和问题方法的一部分:

public static class data_layer
{
    private static string[] items;
    private static string[] description;

    //will return description for an item id. if no item id is found, null is returned
    public static string getDesc(string key)
    {
        int i = 0;
        bool flag = false;
        //search for the item id to find its index
        for(i = 0; i < items.Length; i++)
        {
            if(items[i] == key)
            {
                flag = true;
                break;
            }
        }
        if(flag)
            return description[i];
        else
            return null;
    }
    public static string[] getItems()
    {
        return items;
    }

    public static bool setItemsAndDescriptions()
    {
        ArrayList itemIDs = new ArrayList();
        ArrayList itemDescs = new ArrayList();

        SqlConnection sqlConn = new SqlConnection();
        sqlConn.ConnectionString = ConfigurationManager.ConnectionStrings["MAS200RAWConnectionString"].ConnectionString;
        string query = "SELECT ItemNumber, ItemDescription FROM OUS_IM1_InventoryMasterfile " +
            "WHERE ItemNumber LIKE 'E%' OR ItemNumber LIKE 'B%' OR ItemNumber LIKE 'D%'";

        try
        {
            sqlConn.Open();
            SqlCommand sqlComm = new SqlCommand();
            sqlComm.Connection = sqlConn;
            sqlComm.CommandType = CommandType.Text;
            sqlComm.CommandText = query;
            SqlDataReader reader = sqlComm.ExecuteReader();
            if (reader == null)
                return false;

            //add the queried items to the ddl
            while (reader.Read())
            {
                itemIDs.Add(reader["ItemNumber"].ToString().Trim());
                itemDescs.Add(reader["ItemDescription"].ToString().Trim());
            }
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
        }
        finally
        {
            sqlConn.Close();   //NOTE: I HAVE A BREAKPOINT HERE FOR DUBUGGING
        }

        items = itemIDs.ToArray(typeof(string)) as string[];
        description = itemDescs.ToArray(typeof(string)) as string[];
        return true;
    }
}

这一切都运行正常,但是通过把断点放在我说的地方,我注意到类成员项和描述在我的程序(本地asp开发服务器)的执行之间保留了它们分配的内存和元素。为什么程序结束时退出(从浏览器退出或停止调试模式),这个内存不会被释放?有没有办法手动释放这个内存并为静态类创建一个析构函数?

2 个答案:

答案 0 :(得分:7)

不,静态类没有析构函数这样的东西,但你可以这样做:

public static void Unload() {
    items = description = null;
}

Re“为什么程序结束时不释放这个内存” - 如果你的意思是退出浏览器,服务器甚至都不会注意到。当应用程序池(在IIS中)死亡时,它将被清除。

答案 1 :(得分:2)

这是因为字段是静态的,停止调试并不意味着WebDev服务器已关闭。 如果要为每个用户存储字符串,请将它们放在会话对象中。它保证每个用户都可以使用它们,并且一旦会话结束(超时或关闭浏览器窗口)就会被忘记。