C# 为什么使用GC.Collect?

C# 为什么使用GC.Collect?,c#,garbage-collection,C#,Garbage Collection,我知道这已经被问过无数次了,我知道普遍的答案是“不要这样做”,从我有限的知识来看,我完全支持这一点。然而,我正在处理其他人的代码,而他恰好使用了GC.Collect,在这种情况下,我几乎看不出它有什么用处。我仍然在怀疑编码者,也许有人能解释他的意图。不用说,这个编码员是不可用的,他只是在我的公司工作,我碰巧继承了他的代码 所以基本上我有一个类,他为这个类实现了一个Dispose()方法(见代码末尾),并在其中调用GC.Collect。该类有一个从datatable生成CSV文件的方法,并在该方法

我知道这已经被问过无数次了,我知道普遍的答案是“不要这样做”,从我有限的知识来看,我完全支持这一点。然而,我正在处理其他人的代码,而他恰好使用了GC.Collect,在这种情况下,我几乎看不出它有什么用处。我仍然在怀疑编码者,也许有人能解释他的意图。不用说,这个编码员是不可用的,他只是在我的公司工作,我碰巧继承了他的代码

所以基本上我有一个类,他为这个类实现了一个Dispose()方法(见代码末尾),并在其中调用GC.Collect。该类有一个从datatable生成CSV文件的方法,并在该方法的末尾正确调用StreamWriter.Close()。尽管继承自类ErrorManager,但它几乎不包含两个成员(string和int),并对它们执行一些基本操作

public class ExportCSV : ErrorManager
{
    public ExportCSV(TypeUser type) { }

    public string CreateCSV(DataTable dt, string fileName)
    {
        string retval = "";
        retval = fileName;

        StreamWriter sw = new StreamWriter(fileName, false);

        try
        {
            int iColCount = dt.Columns.Count;

            // Scrive i nomi dei campi nella prima RIGA.
            for (int i = 0; i < iColCount; i++)
            {
                sw.Write(dt.Columns[i]);
                if (i < iColCount - 1)
                {
                    sw.Write(",");
                }
            }
            sw.Write(sw.NewLine);

            // Now write all the rows.
            foreach (DataRow dr in dt.Rows)
            {
                for (int i = 0; i < iColCount; i++)
                {
                    if (!Convert.IsDBNull(dr[i]))
                    {
                        if (dt.Columns[i].DataType == typeof(string))
                            sw.Write("\"" + dr[i].ToString().Replace("\"", "\"\"") + "\"");
                        else
                            sw.Write(dr[i].ToString().Replace(",", "."));

                        //Scrive il valore del campo
                        sw.Write(dr[i].ToString());

                    }
                    if (i < iColCount - 1)
                    {
                        sw.Write(",");
                    }
                }
                sw.Write(sw.NewLine);
            }
            sw.Close();
        }
        catch (Exception ex)
        {
            ErrorCode = 1;
            ErrorDescription = ex.Message;
            retval = "";
        }
        finally
        {
            sw.Close();
        }

        return retval;
    }

    #region Dispose Members

    public void Dispose()
    {
        GC.Collect();
    }

    #endregion
}
公共类导出CSV:ErrorManager
{
公共导出CSV(类型用户类型){}
公共字符串CreateCSV(数据表dt,字符串文件名)
{
字符串retval=“”;
retval=文件名;
StreamWriter sw=新StreamWriter(文件名,false);
尝试
{
int iColCount=dt.Columns.Count;
//我的名字是第一个名字。
对于(int i=0;i
所以我的问题是,GC.Collect()到底在这里做什么

很抱歉我的问题有任何缺陷,我已经用stackoverflow搜索别人的问题很长时间了,但我自己以前几乎没有问过任何问题。

哇。甚至没有任何理由。这个类甚至没有任何字段或任何东西

我想有人试图模仿C++中使用的确定性内存管理。唯一的用途就是确保内存被更快释放——现在很少需要的东西。如果应用程序除了这个之外做什么,它很快就会被回收。 因此,除非您完全愿意用CPU和延迟来换取一点额外的内存,否则不要费心去处理

Dispose
,以及
GC.Collect
调用。但首先避免创建大量不必要的对象可能是值得的-
dr[i].ToString().Replace(“,”,“)
在以微妙的方式破坏应用程序方面非常出色,而且效率相当低。

哇,甚至没有任何理由。该类甚至没有任何字段或任何内容

我想有人试图模仿C++中使用的确定性内存管理。唯一的用途就是确保内存被更快释放——现在很少需要的东西。如果应用程序除了这个之外做什么,它很快就会被回收。


因此,除非您完全愿意用CPU和延迟来换取一点额外的内存,否则不要费心去处理
Dispose
,以及
GC.Collect
调用。但首先避免创建大量不必要的对象可能是值得的-
dr[i].ToString().Replace(“,”,“)
非常擅长以微妙的方式破坏应用程序,而且效率相当低。

我猜他并不真正知道自己在做什么。即使他想立即收集正在处理的实例,也不会发生这种调用,因为您仍然有对它的引用(从您调用
Dispose
方法的地方)我猜他并不真正知道自己在做什么。即使他想立即收集正在被处置的实例,调用也不会发生,因为您仍然有对它的引用(从您调用
Dispose
方法的地方)只有一个原因。这一行

StreamWriter sw = new StreamWriter(fileName, false);
开发人员无法在try块中找到使用块的方法,他/她希望GC能够帮助他/她。否

using (StreamWriter sw = new StreamWriter(fileName, false))
{

}
他/她最后添加block.sw.Dispose()

注意:我做过很多bug修复项目。不要给每个代码块赋予特殊的意义。有时这可能是“开发人员”的原因

看看这个街区

    ErrorCode = 1;
    ErrorDescription = ex.Message;
    retval = "";

这意味着什么?抓住任何原因并设置错误对象属性,您是否真的感兴趣为什么您不能写入文件或您不能在文件上写入的真正错误?没有原因。

只有一个原因。这一行

StreamWriter sw = new StreamWriter(fileName, false);
开发人员无法在try块中找到使用块的方法,他/她希望GC能够帮助他/她。否

using (StreamWriter sw = new StreamWriter(fileName, false))
{

}
他/她