2009-05-07 14 views
2

Ich habe eine Funktion in C# 2.0 namens Foo(), die einen Wert vom Typ Boolean zurückgibt. Ich instanziiere ein Objekt in der Funktion, die ich nicht zerstöre, bevor ich den booleschen Wert zurückgebe. Ich möchte wissen, ob es notwendig ist, die erstellten Objekte zu zerstören, bevor der Wert zurückgegeben wird.Rückgabe von einer Funktion ohne Objekte zu zerstören

danke.

+1

schauen Sie sich alle richtigen Antworten und 0 Upvotes an. Warum so geizig? –

Antwort

5

Nein ist es nicht. Wenn Sie mit der Foo-Methode Werttypen erstellen, befinden sie sich auf dem Stapel und werden so aufgeräumt, wenn der Stapel abgewickelt wird. Wenn Sie Referenztypen erstellen, wird der Verweis auf diese Instanzen den Gültigkeitsbereich verlassen, da die Methode beendet wird und die Instanzen daher für die Garbage Collection verfügbar sind.

+0

Danke für die Erklärung! – pradeeptp

+0

Obwohl es stimmt, dass es im Allgemeinen nicht nötig ist, die von Foo erstellten Objekte explizit zu zerstören, werden sie NICHT auf dem Stack zugewiesen! In den meisten verwalteten Sprachen gibt es einen degenerierten Stack, der zum Verfolgen von Funktionsaufrufen verwendet wird, und alle Objekte werden auf dem verwalteten Heap zugeordnet. –

+0

@Tal: Hast du meine Antwort gelesen ?! Der erste Satz ist "nein ist es nicht" wie in "nein es ist nicht notwendig, etwas zu zerstören". Lokale Werttypen * sind * auf dem Stapel. Objekte oder Referenztypen, wenn Sie möchten, werden immer auf dem Heap zugewiesen. –

1

nein. es sei denn, das fragliche Objekt implementiert IDisposable, in diesem Fall wickeln Sie es in eine using() {} Anweisung

+0

Sie sollten IDisposable immer unter Berücksichtigung beider Möglichkeiten implementieren: Der Benutzer wird das Objekt explizit (oder implizit in einem Verwendungsblock) entsorgen, und der Benutzer wird das Objekt nicht entsorgen. In der späteren Situation sollten Sie einen Destruktor implementieren, der alle notwendigen Bereinigungen durchführt. –

+2

@ribeas - Sie haben die Regel rückwärts. Wenn ein Objekt einen Destruktor hat, muss IDisposable ebenfalls implementiert werden. Aber wenn ein Objekt IDisposable implementiert, ist es nur selten notwendig, es einem Destruktor zu geben. z.B. Der Compiler erstellt Iterator-Klassen, um IDisposable zu unterstützen, und dennoch haben sie keinen Destruktor, eine Klasse, die nur Verweise auf andere IDisposables enthält, sollte IDisposable unterstützen, benötigt aber selbst keinen Destruktor. Es ist fast nie notwendig, heute in C# einen Destruktor zu schreiben. SafeHandle ist ein besseres Werkzeug für den Umgang mit Betriebssystemressourcen. –

0

In C# werden alle Objekte automatisch mit Garbage Collection erfasst, und im Prinzip gibt es keine Möglichkeit, ein Objekt explizit zu entfernen. Daher müssen Sie Objekte nicht manuell löschen.

Wenn Ihr Objekt eine Ressource enthält, möchten Sie sichergehen, dass die Ressource freigegeben wird, aber Sie müssen das Objekt nicht zerstören (können).

0

Es wäre besser, wenn Sie im Falle von E/A- oder Db-Objekten die dispose-Methode verwenden. Wenn Sie versuchen, eine Datei zu ändern, die zuvor referenziert und nicht freigegeben wurde, kann es zu einer Ausnahme kommen.

Sie können dem Objekt auch Null zuweisen, um den Verweis zu entfernen.

Verwandte Themen