C# 释放静态类别中的托管对象
在静态/共享类中释放托管对象的最佳实践是什么 我有3个大数据表,大部分时间都不使用它们 GC不会释放它们,因为它们是静态的-我说的对吗 我想知道在C# 释放静态类别中的托管对象,c#,.net,vb.net,memory-management,C#,.net,Vb.net,Memory Management,在静态/共享类中释放托管对象的最佳实践是什么 我有3个大数据表,大部分时间都不使用它们 GC不会释放它们,因为它们是静态的-我说的对吗 我想知道在ReleaseDatatables()中将它们设置为null是否有用,或者我只是在浪费时间 多谢各位 public static class Helpers { private static DataTable _branchDT; public static DataTable branchDT { get
ReleaseDatatables()
中将它们设置为null是否有用,或者我只是在浪费时间
多谢各位
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;
}
公共静态类帮助程序
{
私有静态数据表_branchDT;
公共静态数据表branchDT
{
得到
{
如果(_branchDT==null)
{
_branchDT=新数据表();
_branchDT=Orange.projectmanagement.DAL.Database.getDataset(“从分支中选择*)。表[0];
返回_branchDT;
}
其他的
{
返回_branchDT;
}
}
设置{u branchDT=value;}
}
私有静态数据表_departmentDT;
公共静态数据表部门
{
得到
{
如果(_departmentDT==null)
{
_departmentDT=新数据表();
_departmentDT=Orange.projectmanagement.DAL.Database.getDataset(“从部门中选择*)。表[0];
返回部门DT;
}
其他的
{
返回部门DT;
}
}
设置{u departmentDT=value;}
}
私有静态数据表_TeamsDT;
公共静态数据表TeamsDT
{
得到
{
如果(_TeamsDT==null)
{
_TeamsDT=新数据表();
_TeamsDT=Orange.projectmanagement.DAL.Database.getDataset(“从团队中选择*)。表[0];
返回团队SDT;
}
其他的
{
返回团队SDT;
}
}
设置{u TeamsDT=value;}
}
///
///将所有datatables设置为null,以便在下一次调用get属性方法时释放内存或使其自行刷新
///
///
公共静态void ReleaseDatatables()
{
//datatables设置为null,因此下一次调用它们时,它们将通过get prop方法中对db的新查询进行刷新
branchDT=null;
departmentDT=null;
TeamsDT=null;
}
GC在计算有关是否可以释放内存的信息时会检查“根”。如果任何引用类型变量绑定到根,则不会收集对象
您的静态对象就是这些根对象中的一个,因此如果您将变量设置为null,您的大数据将不会绑定到根,并且将被释放
此外,您还可以查看
这是你案子的另一种方法
更新 但您的解决方案对我来说似乎不是最佳实践。从db表中读取所有数据是非常危险的,因为您不知道其中存储了多少数据。最好将您的属性设置为IEnumerable并使用“收益率-收益率”没有此缓存的数据块。当然,这取决于您尝试执行的操作的上下文。GC在计算有关是否可以释放内存的信息时会检查“根”。如果任何引用类型变量绑定到根,则不会收集对象 您的静态对象就是这些根对象中的一个,因此如果您将变量设置为null,您的大数据将不会绑定到根,并且将被释放 此外,您还可以查看 这是你案子的另一种方法
更新
但您的解决方案对我来说似乎不是最佳实践。从db表中读取所有数据是非常危险的,因为您不知道其中存储了多少数据。最好将您的属性设置为IEnumerable并使用“收益率-收益率”没有缓存的数据块。当然,这取决于您尝试执行的操作的上下文。是的。但是不需要释放静态类 静态类不需要释放,因为它们不是对象,也不消耗内存 静态类中的静态字段是消耗内存的对象。它们不会被释放,因为它们在应用程序关闭之前是可访问的。
如果要释放一些内存,请将该字段设置为null。是。但是不需要释放静态类 静态类不需要释放,因为它们不是对象,也不消耗内存 静态类中的静态字段是消耗内存的对象。它们不会被释放,因为它们在应用程序关闭之前是可访问的。
如果要释放一些内存,请将该字段设置为null。“我有3个大数据表,大部分时间不使用它们”那么,为什么要存储它们呢?在需要数据时向数据库索要数据,不要将旧数据保存在内存中。我考虑过这是一种选择,但仍想知道在创建数据成本较高且保存数据成本较低的情况下,将其设置为null是否有用缓存数据是明智的。DataTable的区别在于创建数据和使用数据都比较昂贵保留数据非常昂贵。取决于行数,这一数字永远不会减少。但是,团队、分支机构和部门等数据项应该有一个合理的上限。唯一的另一个问题是,当数据库表更改时,您的数据可能很容易过时。做出决定是程序员的工作,我们无法做到根据MS的用法,当“操作很贵,你想和用户交流时,他们应该考虑缓存结果”。那你为什么要存储它们呢?在需要时向数据库查询数据,不要将旧数据保存在内存中。我认为这是一个选项,但仍不知道是否将它们设置为null