首页 > 解决方案 > 我在使用 C# 中的语句时遇到问题

问题描述

// 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。然后我发现这个bug是因为我将数据写入文件后没有刷新,我立即读取文件。

这是官方文档https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/using-statement

我想知道在哪里解释这两种方式之间的区别。

标签: c#

解决方案


using如果您使用的是足够现代的 C# 版本,那么这两个 s 之间没有区别,任何一种方式都可以编译和运行(您编写 a 的方式using对 AutoFlush 属性的值没有影响),除了范围大小差异; 在您发布的代码中,我们绝对可以看到using第一种方式的范围结束,但我们看不到第二种方式。

因为关闭流写入器会刷新它,并且处理它会关闭它,所以我们可以确定您的第一个流写入器何时被刷新。但我们无法确定您的第二种方式何时被刷新。

例如,如果您正在调试并且已经退出了写入行并且using在第一种情况下退出了,那么您的流写入器应该被刷新。在第二个中不会是这种方式(如果您跳过写入然后测试以查看数据是否已被刷新)

//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 无关,您的代码似乎没有使用它;我认为差异纯粹是由于对第一种和第二种方式的范围大小的误解以及期望流写入器已刷新的代码何时运行


推荐阅读