2010-11-23 12 views

Antwort

1

Ich sehe nicht, warum es den GC bei normalem Gebrauch beeinflussen sollte. Es ist nur ein Feld. Und der GC folgt einfach Bezugstypfeldern (oder Referenzen, die in Strukturfeldern enthalten sind).

Sie könnten möglicherweise künstliche Szenarien konstruieren, in denen es den GC beeinflusst (vielleicht missbrauchen defensive Kopien des Readonly-Feldes), aber es wird nicht mit normaler Verwendung auftreten.

Und natürlich können Sie nicht das Feld gesetzt, ein Verfahren wie Dispose auf null in die nützlich sein könnte, wenn Sie teure Besitz Objekte bereit für GC haben wollen, während etwas einen Verweis auf das enthaltende Objekt enthält.

Schlechte Probe eines Programms Verhaltensänderung aufgrund readonly

Dieses Programm zeigt, dass nur ein Feld Wechsel von nicht nur lesbar auf Nur-Lesen-Sammlung eines Objekts mit ansonsten identischen Code verhindern kann. Es missbraucht, dass ein schreibgeschütztes Feld beim Methodenaufruf kopiert wird, um das Obj-Feld in der schreibbaren Struktur auf null zu setzen und den Verweis in der readonly-Struktur beizubehalten. Da verhindert wird, dass die Referenz null wird, verhindert sie, dass das Objekt erfasst wird.
Das hat natürlich keinen Einfluss auf den GC. Stattdessen wird die Semantik von readonly missbraucht, um einen anderen Objektgraphen mit readonly als ohne zu erstellen. Also ist Jareds Aussage immer noch völlig richtig.

struct EvilStruct 
{ 
    public readonly object Obj; 

public void SetToNull() 
{ 
    this=new EvilStruct(); 
} 

public EvilStruct(object obj) 
{ 
    Obj=obj; 
} 
} 

readonly EvilStruct s1=new EvilStruct(new object()); 
EvilStruct s2=new EvilStruct(new object()); 

void Main() 
{ 
    s1.SetToNull(); 
s2.SetToNull(); 
s1.Obj.Dump();//An instance of System.Object 
s2.Obj.Dump();//null 
//now s1.Obj can't be collected, but what was once in s2.Obj can 
} 
+0

Es tut nicht. Readonly ändert das Feld selbst nicht, worauf es hinweist. Das Objekt wird irgendwann gesammelt, wenn es nicht mehr verwurzelt ist. –

+0

Es wurde ein Beispiel für ein Programm gefunden, bei dem ein Objekt schreibgeschützt verhindert wird. – CodesInChaos

+0

Im besten Fall zeigt dieses Programm, dass Sie es nicht kompiliert haben, es zu kompilieren, da es keine "Dump" -Methode in "Object" gibt. Außerdem ist deine "Main" -Funktion nicht statisch, und wenn es so ist, kannst du nicht auf 's1' und' s2' zugreifen. –

6

Nein, tut es nicht. Der GC funktioniert, indem er Speicher für Objekte zurückfordert, die von keinem der verwurzelten Objekte erreichbar sind. Der readonly-Modifikator hat keinen Einfluss auf diesen Prozess. Zwei Objektgraphen, die mit Ausnahme von einem identisch waren, das ein paar schreibfreie Felder hatte, würden in der gleichen Weise gesammelt werden.

0

readonly ist eine C# -Funktion. Der GC ist eine CLI-Funktion. Daher kann es einfach nicht den GC überhaupt beeinflussen.

Verwandte Themen