met*_*hod 1 .net c# 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);
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,如果我做了一个for循环调用System.IO.AppentAllText 5次,例如将StreamWriter创建5次,每次迭代它是初始化和处理还是只初始化一次?
例:
for(int i = 1; i < 4; ++i)
{
System.IO.File.AppendAllText("a", "a");
}
Run Code Online (Sandbox Code Playgroud)
该using块扩展为相当于此代码:
StreamWriter writer;
try
{
writer = new StreamWriter(path, true, encoding))
writer.Write(contents);
}
finally
{
if (writer != null)
writer.Dispose();
}
Run Code Online (Sandbox Code Playgroud)
所以是的,每当一个using块退出时,对象就会被丢弃.每当您重新输入该函数时,StreamWriter都会初始化一个新函数.
但请注意,这与垃圾收集器无关.GC会在它感觉到的时候运行,扫描分配的对象,注意有五个StreamWriter对象没有连接到任何GC Root,并丢弃它们.无论您是否Dispose使用过using,都是如此,这就是GC的工作原理.
using这里是什么释放对象持有的非托管资源 - 在这种情况下,文件句柄.如果StreamWriter未被销毁或以其他方式明确关闭,则文件将保持锁定状态,直到您的流程完成或GC决定激活为止.这就是using块和IDisposableinterace的用途 - 确保显式释放GC不知道的对象.