Anidadas usando declaraciones en C#

Resuelto SBurris asked hace 15 años • 17 respuestas

Estoy trabajando en un proyecto. Tengo que comparar el contenido de dos archivos y ver si coinciden exactamente.

Antes de mucha verificación y validación de errores, mi primer borrador es:

  DirectoryInfo di = new DirectoryInfo(Environment.CurrentDirectory + "\\TestArea\\");
  FileInfo[] files = di.GetFiles(filename + ".*");

  FileInfo outputFile = files.Where(f => f.Extension == ".out").Single<FileInfo>();
  FileInfo expectedFile = files.Where(f => f.Extension == ".exp").Single <FileInfo>();

  using (StreamReader outFile = new StreamReader(outputFile.OpenRead()))
  {
    using (StreamReader expFile = new StreamReader(expectedFile.OpenRead()))
    {
      while (!(outFile.EndOfStream || expFile.EndOfStream))
      {
        if (outFile.ReadLine() != expFile.ReadLine())
        {
          return false;
        }
      }
      return (outFile.EndOfStream && expFile.EndOfStream);
    }
  }

Parece un poco extraño tener usingdeclaraciones anidadas.

¿Hay una mejor manera de hacer esto?

SBurris avatar Aug 26 '09 00:08 SBurris
Aceptado

La forma preferida de hacer esto es colocar solo una llave de apertura {después de la última usingdeclaración, así:

using (StreamReader outFile = new StreamReader(outputFile.OpenRead()))
using (StreamReader expFile = new StreamReader(expectedFile.OpenRead())) 
{
    ///...
}
SLaks avatar Aug 25 '2009 17:08 SLaks

Si los objetos son del mismo tipo puedes hacer lo siguiente

using (StreamReader outFile = new StreamReader(outputFile.OpenRead()), 
                    expFile = new StreamReader(expectedFile.OpenRead()))
{
    // ...
}
Gavin H avatar Aug 25 '2009 17:08 Gavin H

Cuando los IDisposables son del mismo tipo, puedes hacer lo siguiente:

 using (StreamReader outFile = new StreamReader(outputFile.OpenRead()), 
     expFile = new StreamReader(expectedFile.OpenRead()) {
     // ...
 }

La página de MSDN usingtiene documentación sobre esta característica de idioma.

Puede hacer lo siguiente independientemente de que los IDisposablemensajes sean del mismo tipo o no:

using (StreamReader outFile = new StreamReader(outputFile.OpenRead()))
using (StreamWriter anotherFile = new StreamReader(anotherFile.OpenRead()))
{ 
     // ...
}
jason avatar Aug 25 '2009 17:08 jason

Desde C# 8.0 puedes usar una declaración de uso .

using var outFile = new StreamReader(outputFile.OpenRead());
using var expFile = new StreamReader(expectedFile.OpenRead());
while (!(outFile.EndOfStream || expFile.EndOfStream))
{
    if (outFile.ReadLine() != expFile.ReadLine())
    {
         return false;
    }
}
return (outFile.EndOfStream && expFile.EndOfStream);

Esto eliminará las variables de uso al final del alcance de las variables, es decir, al final del método.

 avatar Aug 25 '2019 18:08