C# 在.NET中处理对象?

C# 在.NET中处理对象?,c#,.net,garbage-collection,dispose,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

查看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);
    }
}
我的问题是,如果我做了5次for循环调用System.IO.AppentAllText,例如StreamWriter会被创建5次,每次迭代都会初始化和释放,还是只初始化一次

例如:

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

如果查看反编译代码,则流位于using语句中,因此将被清理。它将被全部初始化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
或使用
使用
,这都是正确的,这就是GC的工作方式


这里使用
所做的是释放对象所持有的非托管资源—在本例中是文件句柄。如果
StreamWriter
未被销毁或以其他方式显式关闭,则该文件将一直处于锁定状态以进行编辑,直到您的进程完成或GC决定激活为止。这就是
使用
块和
IDisposable
交互的目的-确保明确释放GC不知道的对象。

请编码。您将如何创建它们?请发布循环代码。@TimSchmelter:是的。创建一个名为
a
的文件是完全合理的。(它不需要是绝对文件名。)另一方面,使用
++i
技巧的
for
循环是避免一个错误的好方法,特别是当您的代码将被其他人使用时。这是一种非常复杂和不清楚的循环5次的方式。@Avnershaar Kashtan-“你用++i技巧的for循环是…一种非常复杂和不清楚的循环5次的方式”-在这种情况下++i和i++完全等价,都将循环3次,而不是5次。@Joe Point证明了这一点。我以为复杂的语法会达到既定的目标,并没有费心在头脑中解释它。。。因此,您应该在内存中追加文本(StringBuilder!),并在每个大操作中仅与实际文件交互一次。然而,当
using
-块离开时,隐式的
Dispose
-调用不会自动强制垃圾收集器发挥作用。它释放了保留的资源(并阻止garbace收集器首先完成实例),但垃圾收集器将在下一个常规周期中收集这五个实例。Nathan,我回答的是代码的行为,而不是应该如何使用,其中一个原因是,我在编辑问题之前发布了我的答案,以包括代码示例,并且因为关于如何使用代码的全面声明需要比提供的数据更多的信息。