RAII Helperklassen in C#
-
Naja z.B. wie schon oben skizziert.
Oder so Sachen wie
Thingy GetCoolestThingy() { using (var coolestThingyGuard = new DisposeGuard<Thingy>()) { foreach (...) { using (var someThingyGuard = DisposeGuard.Alloc(CreateSomeThingy(...))) { if (coolestThingyGuard.Target == null || IsCooler(someThingyGuard.Target, coolestThingyGuard.Target)) { coolestThingyGuard.Dispose(); coolestThingyGuard.Target = someThingyGuard.ReleaseTarget(); } } } // ... return coolestThingyGuard.ReleaseTarget(); } }
Auch das könnte man natürlich ohne "re-seatable" Target lösen -- z.B. indem man der
DisposeGuard<T>
Klasse eineSwap
Funktion verpasst.
Oder eine expliziteReplaceTarget
Funktion.
-
Ah sorry, ich bin anscheinend blind. Hab das vorherige Beispiel irgendwie übersehen. Aber ja, ich würde da schon eher eine Funktion hinpacken. Muss nicht mal ein Swap sein, könnte auch ein Realloc sein oder sowas.
public class DisposeGuard<T> { public void Realloc(T newTarget) { Dispose(); m_target = target; } }
Damit wäre gewährleistet, dass das alte
Target
sauber aufgeräumt wird. Wer das nicht möchte, kann immer noch vorher einReleaseTarget
aufrufen.Vielleicht wäre es hier aber dann auch sinnvoll eine Aufteilung zwischen
Dispose
undDisposeTarget
zu machen. Heisst Dispose ruftDisposeTarget
auf undRealloc
ruftDisposeTarget
auf. Nicht nötig, aber klarer. Aber gut, das sind Details.
-
Dravere schrieb:
Ah sorry, ich bin anscheinend blind.
Haha, macht nix, und sicher nicht so blind wie ich oft