Home > Enterprise >  When does StreamReader become null in C#?
When does StreamReader become null in C#?

Time:04-16

I saw this link:

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

The part of the code is:

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();
}

When does StreamReader become null?

CodePudding user response:

I think your question is regarding the null check in the finally part.

The StreamReader sr variable may be null in the finally part, if an exception is raised during the execution of the constructor in new StreamReader(filename).

CodePudding user response:

In the code, it is first checked if the file exists, then a StreamReader is created which reads that file. By asking when can the StreamReader be null, you are asking when can it's constructor throw an exception. It can actually happen in several situations.

The constructor will throw an exception if:

  • The process doesn't have read priviledges on the file OR someone else is currently using the file. After all, it was only checked that the file exists, but god knows if the OS will actually allow the process to read the file.
  • The file doesn't exist during StreamWriter construction. Now I know what you're thinking: "But it just checked that the file exists". Yes, but consider this scenario:
  1. it is checked that the file exists
  2. (optional) it just so happens that after the check, the OS thread scheduler decides to suspend the running thread for some milliseconds to make room for other (possibly higher priority) threads
  3. Some other thread, another process, or the user deletes the file
  4. StreamReader constructor is called, and the file doesn't exist anymore

In summary, no amount of prior checking can 100% guarantee you will be able to read the file in the next nanosecond.

  • Related