using-Direktive



  • Hi,

    ich sehe oft sowas, aber weiß nicht so genau was es bedeutet:

    using (SomeClass theClass = new SomeClass ())
    {
        theClass.DoSomething ();
    }
    

    Ich denke mal es ist folgendes:

    SomeClass theClass = null;
    try
    {
        theClass = new SomeClass ();
    }
    catch (Exception ex)
    {
        throw ex;
    }
    finally
    {
        theClass.Dispatch ();
    }
    

    Aber da frag ich doch lieber mal die Pros 🙂



  • Naja, geht in die richtige Richtung was du denkst ;)Im Prinzip ist es ein try/finally wo im try das Objekt so erstellt wird wie du es beim using hinter der Klammer angibst, und im finally wird einfach die Dispose Funktion des Objektes aufgerufen. Eigentlich macht man das nur wenn Dispose unmanaged Resourcen freigibt, ansonsten hat das keinen Sinn mit dem using. Es gibt aber auch Klassen die "missbrauchen" dieses Konstrukt um was anderes auszuführen. Z.B. ne Stopuhrklasse die im Konstruktor anfägt zu zählen und im Dispose gestoppt wird. Dann hast du nach dem using Konstrukt praktisch die Zeit wie lange der Code im Using gebraucht hat.



  • Mit der using-Direktive (und auch nur damit) kann man in C# einigermassen das RAII-Prinzip nachbilden. Als C++-Verseuchter benutze ich dieses Konstrukt daher eigentlich immer, wenn die Klasse mir IDisposeable anbietet und ich das Objekt nur innerhalb eines Scopes brauche.



  • Ich auch... :p



  • Wie sieht es eigentlich aus mit Exceptions in der using-Direktive aus?
    Wie sollte man dort vorgehen?



  • Wie mit jeder anderen Exception auch.



  • Nochmal der Vollständigkeit halber: der obige Code ist ja nur fast richtig. Daher hier mal das genaue Äquivalent dessen, was ein using-Block macht:

    {
        SomeClass idisp = new SomeClass();
        try {
            // Do something.
        }
        finally {
            if (idisp != null)
                idisp.Dispose();
        }
    }
    

Anmelden zum Antworten