Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 释放静态类别中的托管对象_C#_.net_Vb.net_Memory Management - Fatal编程技术网

C# 释放静态类别中的托管对象

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

在静态/共享类中释放托管对象的最佳实践是什么

我有3个大数据表,大部分时间都不使用它们

GC不会释放它们,因为它们是静态的-我说的对吗

我想知道在
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