A veces necesito usar varios objetos desechables dentro de una función. El caso más común es tener StreamReader y StreamWriter, pero a veces es incluso más que esto.Deshacerse de anidado utilizando sentencias (...)
Declaraciones de uso anidado suman rápidamente y se ven feas. Para remediar esto, he creado una clase pequeña que recoge los objetos IDisposables y los descarta cuando se desecha.
public class MultiDispose : HashSet<IDisposable>, IDisposable
{
public MultiDispose(params IDisposable[] objectsToDispose)
{
foreach (IDisposable d in objectsToDispose)
{
this.Add(d);
}
}
public T Add<T>(T obj) where T : IDisposable
{
base.Add(obj);
return obj;
}
public void DisposeObject(IDisposable obj)
{
obj.Dispose();
base.Remove(obj);
}
#region IDisposable Members
public void Dispose()
{
foreach (IDisposable d in this)
{
d.Dispose();
}
}
#endregion
}
Así que mi código ahora se ve así:
using (MultiDispose md = new MultiDispose())
{
StreamReader rdr = md.Add(new StreamReader(args[0]));
StreamWriter wrt = md.Add(new StreamWriter(args[1]));
WhateverElseNeedsDisposing w = md.Add(new WhateverElseNeedsDisposing());
// code
}
¿Hay algo malo con este enfoque que puede causar problemas en el futuro? Dejé la función Remove heredada del HashSet a propósito para que la clase fuera más flexible. Sin duda, el mal uso de esta función puede hacer que los objetos no se eliminen correctamente, pero hay muchas otras maneras de dispararse en el pie sin esta clase.
-1: Pregunta demasiado subjetiva – Simon
IMO - solo una mala idea en muchos niveles. Espero que encuentres una guía aquí, por tu propio bien y el de cualquier miembro del equipo con el que puedas trabajar. Vea la respuesta de Skeet para mayor claridad. –
@Simon: no seas tonto. Aquí tenemos preguntas sobre nombres, uso de mayúsculas y sangría todo el tiempo. Este es bastante sustancial en comparación. –