Hice una pregunta con respecto a returning a Disposable (IDisposable
) object from a function, pero pensé que podría enturbiar la discusión si planteara esta pregunta allí.No entiendo muy bien el funcionamiento del uso/Objetos desechables
creé un código de ejemplo:
class UsingTest
{
public class Disposable : IDisposable
{
public void Dispose()
{
var i = 0;
i++;
}
}
public static Disposable GetDisposable(bool error)
{
var obj = new Disposable();
if (error)
throw new Exception("Error!");
return obj;
}
}
codifiqué esta manera deliberada, porque entonces yo llamo:
using (var tmp = UsingTest.GetDisposable(true)) { }
Usando el depurador, noto que el método Dispose
nunca se ejecuta, incluso aunque ya hemos creado una instancia de un objeto Disposable
. Si entiendo correctamente el propósito de Dispose
, si esta clase en realidad tuviera mangos abiertos y similares, entonces no los cerraríamos tan pronto como hayamos terminado con ellos.
Hago esta pregunta porque este comportamiento se alinea con lo que esperaría, pero en las respuestas a la pregunta relacionada, las personas parecían indicar que using
se haría cargo de todo.
Si using
de alguna manera se encarga de todo esto, ¿podría alguien explicar lo que me falta? Pero, si este código podría causar una fuga de recursos, ¿cómo sugeriría que codifique GetDisposable
(con la condición de que debo crear una instancia del objeto IDisposable
y ejecutar un código que arroje una excepción antes de la declaración de devolución)?
es correcto. Si el método que crea el IDisposable puede fallar antes de devolver la referencia, es responsable de garantizar que se invoque el desecho. – ScottS