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 eineSwapFunktion verpasst.
Oder eine expliziteReplaceTargetFunktion.
-
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
Targetsauber aufgeräumt wird. Wer das nicht möchte, kann immer noch vorher einReleaseTargetaufrufen.Vielleicht wäre es hier aber dann auch sinnvoll eine Aufteilung zwischen
DisposeundDisposeTargetzu machen. Heisst Dispose ruftDisposeTargetauf undReallocruftDisposeTargetauf. 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
