2009-03-30 8 views

Antwort

15

Nein. Der Mülldetektor wird sehen, dass str2 einen Verweis auf die Daten hat, und es wird nicht erfasst.

7

Nein, hier besteht kein Risiko. Die Referenz wird zurückgegeben, und wenn der Garbage Collector ausgeführt wird, kann der Verweis in main angezeigt werden, sodass die Zeichenfolge nicht freigegeben wird.

Beachten Sie, dass selbst wenn die Zeichenfolge für Garbage Collection zulässig ist, wird es nicht sofort freigegeben werden - nur wenn der Garbage Collector als nächstes ausgeführt wird (oder sogar später, je nachdem, welche Generation es endet).

Beachten Sie, dass der Garbage Collector kann Objekte sammeln, die nicht mehr verwendet werden, auch wenn es eine Variable noch in ihrem Umfang - so lange, wie er weiß, dass der Variable wird nicht noch einmal gelesen werden:

object x = new object(); 
Console.WriteLine(x); 
// Lots more code not touching x 
// The object could be collected at any time here 
7

str und str2 sind beide Referenzen auf ein (String-) Objekt. Der Garbage Collector wird nur Objekte zurückfordern, die keine verbleibenden Referenzen haben.

-1

Falsche Antwort:

String ist unveränderlich, die ich bedeutet glauben, dass in Ihrem Beispiel, werden Sie eine neue Kopie der Zeichenfolge im Speicher haben, so dass, wenn str gereinigt wird, STR2 hat seine eigenen Daten.

Jon Skeet Klarstellung:

Nein - sie sind beide Verweise auf den gleichen String-Objekt. Es kopiert die Referenz nicht die Zeichenfolge.

+0

Nein - sie sind beide Referenzen auf das gleiche String-Objekt. Es kopiert die * Referenz * nicht die Zeichenkette. –

+0

Danke für die Ausbildung – cjk

-2

Es wird Ihnen gut gehen. Zeichenfolgen sind Werttypen. Wenn Sie einen Werttyp zurückgeben, erhalten Sie normalerweise eine Kopie des Objekts. Wenn also die Variable str den Gültigkeitsbereich verlässt und gesammelt wird, ist die str2 Variable in Ordnung.

Nun, da diese Strings sind wir reden hier über und nicht nur irgendeine gewöhnliche Wert-Typ gibt es ein paar andere Dinge, die weitergehen. Ihre "Hallo" Zeichenfolge wird höchstwahrscheinlich vom Compiler in eine String-Tabelle platziert und Ihre String-Variablen werden Referenzen zu demselben Eintrag in der Tabelle sein, um zu vermeiden, viele Kopien der gleichen Zeichenfolge herumzuhalten.

Wie auch immer, mach dir keine Sorgen, dass es gesammelt wird.

+0

String ist kein Werttyp. Es ist ein Referenztyp. Sie erhalten keine Kopie des Objekts, Sie erhalten eine Kopie der * Referenz *. –

+0

(Sie haben Recht, dass das Literal interniert ist, zugegebenermaßen - aber ich würde mir vorstellen, dass im echten Code kein Literal zurückgegeben wird.) –

0

Nein. Solange der Verweis auf den gleichen String gehalten wird, in diesem Fall durch str2. Der GC wird es nicht sammeln.

0

Nein, der Garbage Collector den Inhalt der Zeichenfolge, aus zwei Gründen nicht löschen:

  • Sie haben einen Verweis auf die Saite, und solange es irgendwelche aktiven Verweise auf ein Objekt der Garbage Collector wird es nicht löschen.

  • Es ist ein String-Literal, also ist es eine Konstante in der Baugruppe. Es wird erstellt, wenn die Assembly geladen und entfernt wird, wenn die Assembly entfernt wird (d. H. Wenn die Anwendung beendet wird). Der Garbage Collector wird niemals ein Zeichenfolgenliteral löschen.

Verwandte Themen