Тип, используемый в операторе using, должен быть неявно конвертируемым в IDeisposable

#using-statement #veracode

Вопрос:

У меня есть следующая логика:

 try
{
   using (var contents = new StreamReader(file.InputStream).ReadToEnd()) 
   {
       var rows = contents.Split(new[] { Environment.NewLine }, StringSplitOptions.None);
       rows.ForEach(r => mids.Add(r.Split(',')[0]));
   }
}
catch(IOException e)
{}
finally
{
   contents = null;
}
 

В using заявлении у меня есть ошибка в вопросе. Это произошло, вероятно, потому, что я использую .ReadToEnd() метод.

Без using заявления мне нужно было бы использовать try/catch/finaly для очистки (чтобы устранить veracode проблему с очисткой ресурсов)

Как я могу это исправить, чтобы мне не нужно было использовать trycatchfinnaly и использовать только using инструкцию?

Ответ №1:

Итак, using следует использовать с объектом, который реализует IDisposable интерфейс. Вы вызываете ReadToEnd метод, который возвращает string и contents не является IDisposable (потому что строка не является). Вы должны использовать его вот так:

 using (var streamReader = new StreamReader(file.InputStream)) 
{
    var contents = streamReader.ReadToEnd();
    // Some actions
}
 

Вы хотите очистить StreamReader , contents будет собран GC, когда метод будет завершен, потому что у него есть тип string .