查看来自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");
}
答案 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语句就会被清除。