c# - 为什么我必须在 C# 中关闭 () 一个文件?

标签 c# .net

我知道这可能看起来很愚蠢,但为什么只有在我关闭 () 文件时以下代码才有效?如果我不关闭文件,则不会写入整个流。

步骤:

  1. 在表单加载时运行此代码。
  2. 显示后使用鼠标关闭表单。
  3. 程序终止。

当文件对象超出范围时,它不应该被刷新或自动关闭吗?我是 C# 的新手,但我习惯于在 C++ 析构函数中添加对 Close() 的调用。

// Notes: complete output is about 87KB. Without Close(), it's missing about 2KB at the end.

// Convert to png and then convert that into a base64 encoded string.
string b64img = ImageToBase64(img, ImageFormat.Png);
// Save the base64 image to a text file for more testing and external validation.
StreamWriter outfile = new StreamWriter("../../file.txt");
outfile.Write(b64img);
// If we don't close the file, windows will not write it all to disk. No idea why
// that would be.
outfile.Close();

最佳答案

C# 没有自动确定性清理。如果你想控制它何时运行,你必须确保调用清理函数。 using block 是执行此操作的最常见方式。

如果您不自己进行清理调用,那么当垃圾收集器决定内存需要用于其他用途时,清理就会发生,这可能会在很长一段时间后发生。

using (StreamWriter outfile = new StreamWriter("../../file.txt")) {
    outfile.Write(b64img);
} // everything is ok, the using block calls Dispose which closes the file

编辑:正如 Harvey 指出的那样,虽然在收集对象时将尝试清理,但这并不能保证成功。为避免循环引用问题,运行时不会尝试以“正确”顺序终结对象,因此 FileStream 实际上可能在 StreamWriter 终结器时已经失效运行并尝试刷新缓冲输出。

如果您处理需要清理的对象,请使用 using(对于局部范围的使用)或通过调用 IDisposable.Dispose(对于长时间生活对象,例如类(class)成员的指称)。

关于c# - 为什么我必须在 C# 中关闭 () 一个文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3944666/

相关文章:

c# - Visual Studio for Mac 中的大括号缩进

C#虚静态方法

c# - 在 Java 中复制 .NET 排序

c# - 使用接口(interface)有什么好处?

c# - 使用 Visual Studio 自动格式化内联空格

c# - .NET 手动重置事件

c# - 使用 Vector<T> 的 SIMD 向量化 C# 代码运行速度比经典循环慢

c# - PushSharp APNS 通知错误请求的功能不受支持

c# - 这是一个危险的锁定模式吗?

.net - 在 Ubuntu VM 上安装 .Net Core 时出错 : "dotnet restore" fails in CurlHandler. SetProxyOptions()