在静态/共享类中释放托管对象的最佳做法是什么?
我持有3个大型数据表,大部分时间都不使用它们。
GC不会释放它们,因为它们是静态的 - 我是对的吗?
我想知道在public static class Helpers
{
private static DataTable _branchDT;
public static DataTable branchDT
{
get
{
if (_branchDT == null)
{
_branchDT = new DataTable();
_branchDT = Orange.ProjectManagment.DAL.Database.getDataset("SELECT * FROM Branches").Tables[0];
return _branchDT;
}
else
{
return _branchDT;
}
}
set { _branchDT = value; }
}
private static DataTable _departmentDT;
public static DataTable departmentDT
{
get
{
if (_departmentDT == null)
{
_departmentDT = new DataTable();
_departmentDT = Orange.ProjectManagment.DAL.Database.getDataset("SELECT * FROM Departments").Tables[0];
return _departmentDT;
}
else
{
return _departmentDT;
}
}
set { _departmentDT = value; }
}
private static DataTable _TeamsDT;
public static DataTable TeamsDT
{
get
{
if (_TeamsDT == null)
{
_TeamsDT = new DataTable();
_TeamsDT = Orange.ProjectManagment.DAL.Database.getDataset("SELECT * FROM Teams").Tables[0];
return _TeamsDT;
}
else
{
return _TeamsDT;
}
}
set { _TeamsDT = value; }
}
/// <summary>
/// setting all datatables to null in order to free memory or to make them refresh them self in the next call to get property method
///
/// </summary>
public static void ReleaseDatatables()
{
// datatables set to null, hence next call to them they will refresh via new query to db in get prop method
branchDT = null;
departmentDT = null;
TeamsDT = null;
}
中将它们设置为null会有用还是我只是在浪费时间?
谢谢。
{{1}}
答案 0 :(得分:1)
GC检查&#34;根源&#34;在计算有关是否可以释放内存的信息时。如果任何引用类型变量与根绑定,则不会收集对象。
你的静态对象属于这个根,所以如果你为变量设置null,那么你的大数据就不会被绑定到根,而是会被释放。
另外,您可以查看WeakReference object types here 这是您案件的另一种方法
<强>更新强>
但是你的解决方案对我来说似乎不是最好的做法。读取db表中的所有数据非常危险,因为您不知道那里存储了多少数据。让你的属性IEnumerable并使用&#34; yield return&#34;没有这个缓存的大量数据。取决于你当然要做的事情。
答案 1 :(得分:1)
是。但是静态课程不需要发布。
静态课程不需要发布,因为它们不是对象,也不会消耗内存。
静态类中的静态字段是消耗内存的对象。他们不会被释放,因为在应用程序关闭之前它们是可访问的。 如果要释放一些内存,请将该字段设置为null。