Anidadas usando declaraciones en C#
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 using
declaraciones anidadas.
¿Hay una mejor manera de hacer esto?
La forma preferida de hacer esto es colocar solo una llave de apertura {
después de la última using
declaración, así:
using (StreamReader outFile = new StreamReader(outputFile.OpenRead()))
using (StreamReader expFile = new StreamReader(expectedFile.OpenRead()))
{
///...
}
Si los objetos son del mismo tipo puedes hacer lo siguiente
using (StreamReader outFile = new StreamReader(outputFile.OpenRead()),
expFile = new StreamReader(expectedFile.OpenRead()))
{
// ...
}
Cuando los IDisposable
s 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 using
tiene documentación sobre esta característica de idioma.
Puede hacer lo siguiente independientemente de que los IDisposable
mensajes sean del mismo tipo o no:
using (StreamReader outFile = new StreamReader(outputFile.OpenRead()))
using (StreamWriter anotherFile = new StreamReader(anotherFile.OpenRead()))
{
// ...
}
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.