Grundlegende Frage zum Instanzieren von Objekten



  • Hi,

    ich habe auch heute wieder eine Frage 😉

    Ich versteh nicht ganz folgenden Unterschied:

    MyClass^ myClass1 = gcnew MyClass();
    MyClass myClass2;

    Beides funktioniert. Der einzige Unterschied ist dass ich auf die Methoden
    und Eigenschaften des Objektes myClass1 mit "->" zugreife und bei
    myClass2 mit ".".

    Lg Chriss



  • MyClass^ myClass1 = gcnew MyClass(); 
    MyClass myClass2;  // Beim verlassen des Scopes wird automatisch delete myClass; aufgerufen.
    

    Simon

    Edit: Bei Fall zwei wird eigentlich die Dispose Methode aufgerufen beim verlassen des Scopes. Dasselbe tut delete.



  • Hi Simon,

    danke für die Antwort!

    Ich dachte dass bei C++ CLI beim Verlassen des Scopes der Garbage Collector aufräumt?

    Welchen Fall verwende ich normaler Weise?

    Lg Chriss



  • kerberos schrieb:

    Ich dachte dass bei C++ CLI beim Verlassen des Scopes der Garbage Collector aufräumt?

    Grundsätzlich ja, aber zum einen nicht sofort, und zum anderen nicht deterministisch. Du kannst dabei nicht erzwingen, dass am Ende eines Scopes sofort z.B. Datenbankverbindungen oder unmanaged Ressourcen abgeräumt werden.

    Du hast aber in .NET noch das Disposeable-Pattern. Dieses erlaubt die Freigabe von unmanaged Ressourcen in einer RAII-ähnlichen Weise. In C# gibt es dafür den using-Block.

    using (Dings d = new Dings()) {
    } 
    
    // entspricht:
    Dings d = new Dings();
    try {
    } finally {
        d.Dispose();
    }
    

    In C++/CLI nutzt Du, um das zu erreichen, ein "normales" C++-Sprachmittel, nämlich den Scope.

    {
        Dings d;
    
    } // d.Dispose() wird aufgerufen
    

    Wenn Du in C# keine Möglichkeit hast, den using-Block zu nutzen, z.B. weil das Objekt länger lebt als der Scope reicht, musst Du Dispose von Hand aufrufen.

    // irgendwo
    m_dings = new Dings();
    
    // woanders
    m_dings.Dispose();
    

    In C++/CLI würdest Du dann delete m_dings aufrufen.

    // irgendwo
    m_dings = gcnew Dings();
    
    // woanders
    delete m_dings;
    

Anmelden zum Antworten