C# 中 StreamReader 何时变为 null?

arz*_*arz 0 c# streamreader

我看到了这个链接:

https://learn.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();
}
Run Code Online (Sandbox Code Playgroud)

StreamReader什么时候变成null?

小智 5

我认为你的问题是关于nullfinally部分的检查。

如果在 中的构造函数执行期间引发异常,则该StreamReader sr变量可能位于null该部分中。finallynew StreamReader(filename)


Pet*_*ion 5

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

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

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

总之,无论进行多少事先检查都不能 100% 保证您能够在下一纳秒内读取该文件。