在.NET中处理对象?

时间:2012-11-25 20:50:56

标签: c# .net garbage-collection dispose

查看来自GAC的'System.IO.File.AppendAllText'代码,它调用另一个名为'InternalAppendAllText'的方法,该方法创建一个新的StreamWriter并将内容写入文件。

//mscorlib, System.IO
private static void InternalAppendAllText(string path, string contents, Encoding encoding)
{
    using (StreamWriter writer = new StreamWriter(path, true, encoding))
    {
      writer.Write(contents);
    }
}

我的问题是,如果我做了一个for循环调用System.IO.AppentAllText 5次,例如将StreamWriter创建5次,每次迭代它是初始化和处理还是只初始化一次?

示例:

for(int i = 1; i < 4; ++i)
{
    System.IO.File.AppendAllText("a", "a");
}

2 个答案:

答案 0 :(得分:5)

using块扩展为相当于此代码:

StreamWriter writer;
try
{
    writer = new StreamWriter(path, true, encoding))
    writer.Write(contents);
}
finally
{
    if (writer != null)
         writer.Dispose();
}

所以是的,只要using块退出,就会丢弃对象。每当您重新输入该函数时,都会初始化一个新的StreamWriter

但请注意,这与垃圾收集器无关。 GC会在它感觉到的时候运行,扫描分配的对象,注意有五个StreamWriter对象没有附加到任何GC根,并丢弃它们。无论您是否致电Dispose或使用using,都是如此,这就是GC的运作方式。

此处using的作用是释放对象所持有的非托管资源 - 在本例中为文件句柄。如果StreamWriter未被销毁或以其他方式明确关闭,则文件将保持锁定状态,直到您的流程完成或GC决定激活为止。这是using块和IDisposable interace用于 - 确保您明确释放GC不知道的对象。

答案 1 :(得分:3)

如果查看反编译代码,Stream就在using语句中,因此它将被清除。它将被初始化5次,但一旦代码离开using语句就会被清除。