c#using statement和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 on对象,这会导致数据写入文件。 你可以写这样的代码:

 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对象。 在这种情况下,即使在exception情况下也要确保正确处理对象。 所以你可以这样做

 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(); }