[英]GC.Collect() in Dispose in simple class
我在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 核心休息区,所以这段代码对我来说很奇怪。 除了完全奇怪的实现方式之外,这些 GC.Collect() 和 Dispose() 感觉完全没用,因为它是托管代码,而且它很简单 class 没有任何编码执行。 为什么有人会把 Dispose 和 GC.Collect() 放在那里? 我应该删除它吗?
正如评论中已经指出的,Dispose 方法中的GC.Collect()
在这里完全是多余的。 也许他们一开始就弄错了处置模式。
dispose 模式的推荐实现如下:
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this); // sic!
}
protected virtual void Dispose(bool disposing)
{
}
但是,由于您的ProjectAutostart
class 是纯 DTO 并且没有任何一次性字段(并且任何派生类也可能没有),因此您甚至不需要在这里实现 dispose。 只需删除Dispose
方法和接口声明即可。 您需要处理的是DataTable
object,但这已经正确完成。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.