¿Es abusivo utilizar IDisposable y "usar" como medio para obtener un "comportamiento de ámbito" para una seguridad excepcional?
Algo que usaba a menudo en C ++ era dejar que una claseA
manejar una entrada de estado y una condición de salida para otra claseB
, mediante elA
constructor y destructor, para asegurarse de que si algo en ese ámbito arrojara una excepción, entonces B tendría un estado conocido cuando se abandonó el alcance. Esto no es RAII puro en lo que respecta al acrónimo, pero sin embargo es un patrón establecido.
En C #, a menudo quiero hacer
class FrobbleManager
{
...
private void FiddleTheFrobble()
{
this.Frobble.Unlock();
Foo(); // Can throw
this.Frobble.Fiddle(); // Can throw
Bar(); // Can throw
this.Frobble.Lock();
}
}
Lo que hay que hacer así.
private void FiddleTheFrobble()
{
this.Frobble.Unlock();
try
{
Foo(); // Can throw
this.Frobble.Fiddle(); // Can throw
Bar(); // Can throw
}
finally
{
this.Frobble.Lock();
}
}
si quiero garantizar laFrobble
estado cuandoFiddleTheFrobble
devoluciones. El código sería mejor con
private void FiddleTheFrobble()
{
using (var janitor = new FrobbleJanitor(this.Frobble))
{
Foo(); // Can throw
this.Frobble.Fiddle(); // Can throw
Bar(); // Can throw
}
}
dóndeFrobbleJanitor
miradasaproximadamente me gusta
class FrobbleJanitor : IDisposable
{
private Frobble frobble;
public FrobbleJanitor(Frobble frobble)
{
this.frobble = frobble;
this.frobble.Unlock();
}
public void Dispose()
{
this.frobble.Lock();
}
}
Y así es como quiero hacerlo. Ahora la realidad se pone al día, ya que lo que yoquerer usarrequiere que elFrobbleJanitor
es usadocon using
. Podría considerar esto como un problema de revisión de código, pero algo me está molestando.
Pregunta: ¿Lo anterior sería considerado como uso abusivo deusing
yIDisposable
?