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;