C #: и используете, и попробуйте наконец избавиться от плохих опций с StreamReader - PullRequest
0 голосов
/ 04 ноября 2010

подумайте об этом:

StreamReader reader = null;

try
{
    reader = new StreamReader(_fileName);
}
catch
{
    //show error that file not found
    reader.Dispose();
    return false;
}

try
{
    //code to read file
}
catch
{
   //show error badly formed file
}
finally
{
    reader.Dispose();
}
//return 

код выше не работает, когда файл не может быть открыт, потому что он вызывает Dispose для null, что приводит к исключению.

Я не хочу использовать с помощью, потому что я хочу разделить проблемы с открытием файла и чтением его. Этого можно достичь миллионами разных уловов, но я не хочу идти по этому пути. Плюс, если использовать то же самое, что и try-finally, "скрытая утилизация" все равно выдаст нежелательное исключение? что будет лучшим способом, когда все, что мне нужно, это поймать исключение, открывающее его, и исключение, читающее его?

Спасибо & BR - Матти

Ответы [ 4 ]

6 голосов
/ 04 ноября 2010

Лучше использовать оператор using :

using(StreamReader reader = new StreamReader(_fileName))
{
}

Компилятор создаст правильную семантику удаления для вас.

И вы все еще можете использовать try с этим, не беспокоясь об утилизации его самостоятельно:

try
{
    using(StreamReader reader = new StreamReader(_fileName))
    {
         try
         {
            //code to read the file
         }
         catch
         {
            //show error badly formed file
         }
    }
}
catch
{
    // show error that file not found
}
2 голосов
/ 04 ноября 2010

Вы должны проверить, является ли читатель нулевым, прежде чем утилизировать его. Вот так:

StreamReader reader = null;
try
{
    //code to read file
}
catch
{
   //show error badly formed file
}
finally
{
  if( null != reader )
  {
    reader.Dispose();
  }
}
2 голосов
/ 04 ноября 2010

Ваш код верен, если вы проверяете reader на ноль перед вызовом каких-либо методов, где бы он ни находился.

Использование оператора не обязательно, но желательно.

1 голос
/ 04 ноября 2010

StreamReader может выдавать следующие исключения, чтобы вы могли обрабатывать их соответственно: -

ArgumentException
ArgumentNullException
FileNotFoundException
DirectoryNotFoundException
NotSupportedException
ArgumentOutOfRangeException
...