using-statementveracode

Type used in a using statement should be implicitly convertible to IDisposable


I have the following logic:

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

In the using statement I have an error in the question. It happened probably because I use .ReadToEnd() method.

Without the using statement I would need to use try/catch/finally for a clean up (to fix veracode resource clean up issue)

How can I fix that, so I don't need to use try\catch\finally and use only the using statement?


Solution

  • So, using should be used with object which implements IDisposable interface. You calling ReadToEnd method which returns string and contents is not a IDisposable (because string is not). You should use it like this:

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

    You want to clean up StreamReader, contents will be collected by GC when method will finished because it has type string.