Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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中未使用的实例#_C#_Garbage Collection_Idisposable - Fatal编程技术网

C# 是否需要销毁c中未使用的实例#

C# 是否需要销毁c中未使用的实例#,c#,garbage-collection,idisposable,C#,Garbage Collection,Idisposable,我有一个MVCWeb应用程序,它是一个古老而庞大的源代码,现在我正在修改它以进行单元测试。我需要初始化控制器构造函数中的多个对象来抽象DB访问代码。如下图所示 public DownloadsController(ICustomerHistory customerHistory = null, ICustomerInfo customerInfo = null, IDownloadInfo downloadInfo = null, IVersionAccess versi

我有一个MVCWeb应用程序,它是一个古老而庞大的源代码,现在我正在修改它以进行单元测试。我需要初始化控制器构造函数中的多个对象来抽象DB访问代码。如下图所示

            public DownloadsController(ICustomerHistory customerHistory = null, ICustomerInfo customerInfo = null, IDownloadInfo downloadInfo = null, IVersionAccess versionAccess = null,
        ILeadInformation leadInfo = null, ISalesForce salesForce = null,IEvaluationReleaseBuildModel evaluationReleaseBuildModel=null)
    {
        _customerHistory = customerHistory ?? new CustomerHistory();
        _customerInfo = customerInfo ?? new CustomerInfo();
        _downloadInfo = downloadInfo ?? new DownloadInfo();
        _versionAccess = versionAccess ?? new VersionAccess();
        _leadInformation = leadInfo ?? new LeadInformation();
        _salesForce = salesForce ?? new SalesForce();
        _evaluationReleaseBuildModel = evaluationReleaseBuildModel ?? new EvaluationReleaseBuildModel();
    }
现在,我担心如果创建这样的多个对象,是否会出现内存问题

  • 这会造成内存问题吗
  • 我是否需要手动销毁对象,否则GC将处理此
  • 如果我们需要手动销毁,如何销毁它。我不知道我们什么时候需要摧毁这个物体

  • 提前感谢。

    查看中指定的GC条件

    它说条件是,

    •系统的物理内存较低

    •托管堆上已分配对象使用的内存 超过可接受的阈值。该阈值是连续的 在流程运行时进行调整

    •调用GC.Collect方法。几乎在所有情况下,您都没有 调用此方法,因为垃圾收集器连续运行。 此方法主要用于特殊情况和测试

    如果希望应用程序处理分配给您的内存,可能需要使用
    Dispose

    正如MSDN所说

    •您可以实现Dispose方法来释放所使用的非托管资源 你的申请。.NET Framework垃圾回收器不存在 分配或释放非托管内存


    这里有一个来自

    的详细解释,为了在更一般的情况下解决这个问题,只有少数情况下需要显式释放内存

    最大的情况是类包含非托管资源(例如COM对象等),您需要在其中执行自定义清理步骤。这就是Dispose方法的用武之地

    还有几个例子:事件处理程序和收集类可能会导致事实上的内存泄漏,因为在您打算对对象进行垃圾收集之后,它们会保留对对象的引用。例如,如果某个集合类的“寿命”比它所包含的某些项长,则在处理完这些项后,需要从集合类中手动删除它们

    除了这些(无法清理非托管资源或存在事实上的内存泄漏)和其他一些边缘情况外,您通常可以相信GC会做好它的工作


    因此,原始问题的答案实际上取决于您是否持有对这些项的引用的时间比您需要的时间长(仅根据代码示例,很难判断您实际持有它们的时间,或者它们实际需要持有的时间)。如果你这样做,那么它可能会导致内存问题;如果您没有,您可以信任垃圾收集器。

    感谢您的响应,当对象没有引用权限时调用dispose。我的疑问是如何以及何时需要取消引用我的对象。。?1.因为我的应用程序更大,而且这些创建的对象在许多地方都使用,比如在模型和基础中,所以我不能使用“使用选项”自动处理对象。我错了。GC未调用Dispose。您需要手动调用它以释放空间。如果应用程序占用大量内存,则可以使用dispose释放不重要的内容。这里有一个关于dispose的链接。