c# - 我在使用 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
我想知道在哪里解释这两种方式之间的区别。
解决方案
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 无关,您的代码似乎没有使用它;我认为差异纯粹是由于对第一种和第二种方式的范围大小的误解以及期望流写入器已刷新的代码何时运行
推荐阅读
- python - 使用 fitEllipse 对图像进行椭圆拟合
- ubuntu - 如何在我的 ubuntu 命令行中解决这个问题?
- firebase - 如何检测 Firebase 连接是否在线/离线 - Unity
- javascript - 单击导航栏后如何在文本上放置动画?
- input - Lua - “ex.sleep”运行时可以停止输入吗?
- mysql - Mysql从其他表中不存在的表中选择值
- java - 如何输入多个整数或其他类型?
- python - 以特定方式分隔列表的每个项目
- django - Django(v2.0.7) Admin:数据库事务提交后回调
- vsto - VSTO Excel Addin Form 控件在 64 位中变为 Image