StreamReader 何时在 C# 中变为 null?

When does StreamReader become null in C#?

我看到了这个link:

https://docs.microsoft.com/en-us/dotnet/api/system.idisposable?view=net-6.0

部分代码为:

if (!File.Exists(filename))
    throw new FileNotFoundException("The file does not exist.");

this.filename = filename;
string txt = String.Empty;
StreamReader sr = null;
try
{
    sr = new StreamReader(filename);
    txt = sr.ReadToEnd();
}
finally
{
    if (sr != null) sr.Dispose();
}

StreamReader什么时候变为null?

我认为您的问题是关于 finally 部分中的 null 检查。

StreamReader sr变量可能是finally部分的null,如果在new StreamReader(filename).[=16=中的构造函数执行过程中抛出异常]

在代码中,首先检查文件是否存在,然后创建一个 StreamReader 来读取该文件。通过询问 StreamReader 何时可以为 null,您是在询问它的构造函数何时可以抛出异常。它实际上可以在几种情况下发生。

如果出现以下情况,构造函数将抛出异常:

  • 该进程没有文件的读取权限或其他人当前正在使用该文件。毕竟,只是检查文件是否存在,但天知道 OS 是否真的允许进程读取文件。
  • StreamWriter 构建期间文件不存在。现在我知道你在想什么:“但它只是检查文件是否存在”。是的,但请考虑这种情况:
  1. 检查文件是否存在
  2. (可选)恰好在检查之后,OS 线程调度程序决定暂停 运行 线程几毫秒,以便为其他(可能优先级更高的)线程腾出空间
  3. 其他线程、其他进程或用户删除文件
  4. StreamReader构造函数被调用,文件不再存在

总而言之,再多的事先检查也不能 100% 保证您将能够在下一纳秒内读取文件。