繁体   English   中英

c#using statement和StreamWriter

[英]c# using statement and StreamWriter

我正在使用StreamWriter将内容写入记事本。 我发现如果我没有单独使用语句和实例StreamWriter 该方法无法运行。 有人知道原因吗?

    static void Main(string[] args)
    {
        //StreamWriter c = new StreamWriter(@"C:\Users\rxxx\Desktop\important.txt", true);
        using (StreamWriter c = new StreamWriter(@"C:\Users\xxx\Desktop\important.txt", true))
        {
            c.WriteLine("hello");
        }

这可以运行。 但是,如果我改为运行备注部分。 记事本什么都没有显示。

谁知道原因?

因为当你使用 ,这是很好的做法使用对象,它调用Dispose方法和StreamWriter的的情况下,它调用Fush的对象,以及这会导致文件被写入数据。 你可以写这样的代码:

var c = new StreamWriter(@"C:\Test\important.txt", true);
c.AutoFlush = true;
c.WriteLine("hello");
c.Dispose();
StreamWriter c = new StreamWriter(@"C:\Users\rxxx\Desktop\important.txt", true);
// you need to write something to see 
c.WriteLine("hello");

如果使用using语句 ,它将自动处理StreamWriter对象。 但是当你没有使用语句时,你需要手动处理StreamWriter对象。 在这种情况下,即使在异常情况下也要确保正确处理对象。 所以你可以这样做

StreamWriter c =null;
try
{
  c = new StreamWriter(fileFullPath, true);
  c.WriteLine("hello");
}
finally
{
  if (c!= null)
      c.Close();
}

如果不使用using语句,程序不会将数据从缓冲区刷新到文件中。 这就是为什么当你在记事本中打开它时,文件中没有写入“hello”。 您可以显式刷新缓冲区,以便将数据写入文件:

 StreamWriter c = new StreamWriter(@"C:\Users\xxx\Desktop\important.txt", true)
 c.WriteLine("hello");
 c.Flush();

但是,您仍然需要处理流。 但是如果你使用Dispose()方法,它会自动刷新缓冲区(通过调用Flush()方法),所以你不需要使用Flush()!

通过使用'using'语句,不仅可以刷新缓冲区,还可以适当地释放流,而不需要显式地编写Dispose()。 这是最好的方法。

using语句是“ENSURE”,范围内的对象将被Disposed [MSDN]: http//msdn.microsoft.com/en-us/library/yh598w02.aspx

using (StreamWriter c = new StreamWriter(@"C:\Users\xxx\Desktop\important.txt", true))
{
  c.WriteLine("hello");
}

如果你不使用using语句,我仍然建议使用try语句

try
{
  StreamWriter c = new StreamWriter(@"C:\Users\xxx\Desktop\important.txt", true);
}
finally
{
  c.Close();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM