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 eine Swap Funktion verpasst.
    Oder eine explizite ReplaceTarget Funktion.


  • Administrator

    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 ein ReleaseTarget aufrufen.

    Vielleicht wäre es hier aber dann auch sinnvoll eine Aufteilung zwischen Dispose und DisposeTarget zu machen. Heisst Dispose ruft DisposeTarget auf und Realloc ruft DisposeTarget 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 🙂


Anmelden zum Antworten