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
构建期间文件不存在。现在我知道你在想什么:“但它只是检查文件是否存在”。是的,但请考虑这种情况:
- 检查文件是否存在
- (可选)恰好在检查之后,OS 线程调度程序决定暂停 运行 线程几毫秒,以便为其他(可能优先级更高的)线程腾出空间
- 其他线程、其他进程或用户删除文件
StreamReader
构造函数被调用,文件不再存在
总而言之,再多的事先检查也不能 100% 保证您将能够在下一纳秒内读取文件。
我看到了这个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
构建期间文件不存在。现在我知道你在想什么:“但它只是检查文件是否存在”。是的,但请考虑这种情况:
- 检查文件是否存在
- (可选)恰好在检查之后,OS 线程调度程序决定暂停 运行 线程几毫秒,以便为其他(可能优先级更高的)线程腾出空间
- 其他线程、其他进程或用户删除文件
StreamReader
构造函数被调用,文件不再存在
总而言之,再多的事先检查也不能 100% 保证您将能够在下一纳秒内读取文件。