【问题标题】:GC.Collect() in Dispose in simple classDispose 中的 GC.Collect() 简单类
【发布时间】:2022-01-10 22:33:03
【问题描述】:

我在c#中继承了一种古老的网站项目。它起源于2003年 这到处都定义了从 IDisposible 继承并实现 Dispose() 方法的简单类,其中 GC.Collect() 被调用如下:

public class ProjectAutostart : IDisposable
{
    public void Dispose()
    {
        Dispose(true);
        GC.Collect();
    }
    protected virtual void Dispose(bool disposing) { }
    private Int32 _id;
    private Int32 _stepid;
    private Int64 _stepcounter;

    public Int32 ID
    {
        set { _id = value; }
        get { return _id; }
    }
    public Int32 StepID
    {
        set { _stepid = value; }
        get { return _stepid; }
    }
    public Int64 StepCounter
    {
        set { _stepcounter = value; }
        get { return _stepcounter; }
    }
}

这些类的名称如下:

List<Projects.ProjectAutostart> ProjectList = DataLayer.Projects.getProjectAutoStart();

最后是:

public static List<Projects.ProjectAutostart> getProjectAutoStart()
{
    List<Projects.ProjectAutostart> Projects = new List<Projects.ProjectAutostart>();
    DataTable DataTable = SQL.DataTable("getProjectAutoStart", null);
    foreach (DataRow dt in DataTable.Rows)
    {
        Projects.Add(new ProjectAutostart { ID = Convert.ToInt32(dt["projectid"]), StepID = Convert.ToInt32(dt["stepid"]), StepCounter = Convert.ToInt32(e["autostartstepcounter"]) });
    }
    DataTable.Dispose();
    return Projects;
}

我对这种类型的项目没有经验,我完全进入了 .net 核心 restfull 领域,所以这段代码对我来说很奇怪。 除了完全奇怪的实现方式之外,这些 GC.Collect() 和 Dispose() 感觉完全没用,因为它是托管代码并且它是简单的类,没有任何编码执行。为什么有人会把 Dispose 和 GC.Collect() 放在那里? 我应该删除它吗?

【问题讨论】:

  • 对我来说似乎是一种反模式。它没有任何用处 - 我只是删除所有无用的代码。
  • 我同意马修的观点。删除垃圾代码是一个健康的过程。 (而且非常充实,我可能会补充)
  • 更好的是,提交给thedailywtf.com,让大家开怀大笑
  • 此外,SQL 查询可能应该重构为使用 Dapper,或者至少直接从 Reader 读取到新对象中。 Convert.ToInt32 应该是演员 (int)

标签: c# visual-studio web-site-project


【解决方案1】:

正如 cmets 中已经指出的,Dispose 方法中的GC.Collect() 在这里完全是多余的。也许他们一开始就弄错了 dispose 模式。

dispose 模式的推荐实现如下:

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this); // sic!
    }
    protected virtual void Dispose(bool disposing) 
    {
    }

但是,由于您的 ProjectAutostart 类是纯 DTO 并且没有任何一次性字段(并且任何派生类也可能没有),因此您甚至不需要在此处实现 dispose。只需删除 Dispose 方法和接口声明即可。您需要处理的是DataTable 对象,但这已经正确完成了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-25
    • 2012-05-11
    • 1970-01-01
    • 2019-06-17
    • 1970-01-01
    • 2012-12-06
    • 2018-12-22
    • 1970-01-01
    相关资源
    最近更新 更多