// auto flush
using(var sw = new StreamWriter(compileScript))
{
sw.Write(_submission.Cmd);
}
// it doesn't do auto flush
using var sw = new StreamWriter(compileScript);
sw.Write(_submission.Cmd);
如上面的代码所示,我一开始根据IDE提示使用了第二个wat,但出现了一个bug。然后我发现这个错误是因为我在将数据写入文件后没有刷新,所以我立即读取了文件。
这是官方文件https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/using-statement
我想知道在哪里可以解释这两种方式之间的区别。
如果您使用的是足够现代的C#版本,那么这两个using
之间没有区别,无论哪种方式都可以编译和运行(编写using
的方式对AutoFlush属性的值没有影响(,除了作用域大小的差异;在您发布的代码中,我们肯定可以第一次看到using
作用域的末尾,但第二次看不到。
因为关闭流媒体写入程序会刷新它,而处理它会关闭它,所以我们可以确定您的第一个流媒体写入器何时被刷新。。但我们不能确定你的第二条路什么时候有。
例如,如果您正在调试,并且在第一种情况下退出了Write行和using
,那么您的streamwriter应该被刷新。第二次就不会是这样了(如果你在写,然后测试数据是否被刷新(
//way 1
using(var sw = new StreamWriter(compileScript))
{
sw.Write(_submission.Cmd);
} //ends using, closes sw, flushing data
SomeReadFileMethod(compileScript); //it can see flushed data
//way 2
using var sw = new StreamWriter(compileScript);
sw.Write(_submission.Cmd);
SomeReadFileMethod(compileScript); //sw hasn’t flushed yet because it’s still open/using scope still active
这两者都与AutoFlush无关,您的代码似乎没有使用AutoFlush;我认为这种差异纯粹是因为误解了第一种和第二种方式的作用域大小,以及期望流写入程序刷新的代码何时运行
如前所述,这两个代码都是以不同方式编写using语句的一种方式。它类似于使用var而不是实际的数据类型。
代码的意图不会改变。我个人更喜欢
Using(StreamWriter sw = new StreamWriter(stream))
{ // Work with things here }
因为它更可读。根据当前的代码,我建议您使用try、catch、finally来找出代码中的错误,比如使用finally block来关闭和刷新streamwriter。一旦您解决了问题,就可以恢复使用using语句。