2010-11-23 8 views

Répondre

1

Je ne vois pas pourquoi il devrait influencer le GC avec une utilisation normale. C'est juste un champ. Et le GC suit simplement les champs de type référence (ou les références contenues dans les champs struct).

Vous pourriez être en mesure de construire des scénarios artificiels où il influence le GC (en abusant peut-être des copies défensives du champ en lecture seule), mais cela ne se produira pas avec un usage normal.

Et bien sûr, vous ne pouvez pas définir le champ sur null dans une méthode comme Dispose, ce qui peut être utile si vous voulez avoir des objets propriétaires coûteux prêts pour GC alors que quelque chose contient une référence à l'objet conteneur.

échantillon mal d'un changement de comportement programme en raison de readonly

Ce programme montre que tout modification d'un champ de ne pas en lecture seule à lecture seule peut empêcher la collecte d'un objet avec le code autrement identique. Il abuse qu'un champ readonly soit copié sur l'invocation de la méthode pour définir le champ Obj null dans la structure inscriptible et conserver la référence dans la structure readonly. Comme il empêche la référence de devenir nulle, elle empêche la collecte de l'objet.
Mais bien sûr, cela n'influence pas le GC lui-même. Mais à la place, il abuse de la sémantique de readonly pour créer un graphe d'objet différent avec readonly que sans. Donc, la déclaration de Jared est toujours complètement vraie.

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

Ce n'est pas le cas. Readonly modifie le champ lui-même et non ce qu'il pointe vers. L'objet sera collecté à un moment donné lorsqu'il n'est plus enraciné. –

+0

Trouvé un exemple d'un programme dans lequel readonly empêche la collecte d'un objet. – CodesInChaos

+0

Au mieux, ce programme montre que vous n'avez pas pris la peine de le compiler, puisqu'il n'y a pas de méthode 'Dump' dans' Object'. En outre, vous êtes la fonction 'Main' n'est pas statique, et si c'était le cas, vous ne pouvez pas accéder à' s1' et 's2'. –

6

Non, ce n'est pas le cas. Le GC fonctionne en récupérant de la mémoire pour les objets qui ne sont pas accessibles à partir de l'un des objets enracinés. Le modificateur readonly n'a aucun impact sur ce processus. Deux graphes d'objets identiques à l'exception d'un ayant quelques champs en lecture seule seraient collectés de la même manière.

0

readonly est une fonctionnalité C#. Le GC est une fonctionnalité CLI. Par conséquent, il simplement ne peut pas influencer le GC du tout.

Questions connexes