2010-11-23 8 views

答えて

1

通常の使用でGCに影響する理由はわかりません。それは単なるフィールドです。 GCは単に参照型フィールド(または構造体フィールドに含まれる参照)に従います。

GCに影響を及ぼす人工シナリオを構築できます(おそらく、読み取り専用フィールドの守備的なコピーを悪用します)が、通常の使用では発生しません。

もちろん、Disposeのようなメソッドでフィールドをnullに設定することはできません。何かが含まれているオブジェクトへの参照を保持しているときに高価な所有オブジェクトをGC用に準備したい場合に便利です。プログラムの

悪サンプルによるreadonly

に動作を変更するこのプログラムは単に読み取り専用にしない読み取り専用のフィールドを変更すると、他の点では同一コードを持つオブジェクトのコレクションを防止することができることを示しています。書き込み可能な構造体にObjフィールドのnullを設定し、読み出し専用の構造体に参照を保持するために、readonlyフィールドがメソッド呼び出しでコピーされることを悪用します。参照がnullにならないようにするので、オブジェクトが収集されるのを防ぎます。
もちろん、これはGCそのものには影響しません。しかし、代わりにreadonlyのセマンティクスを乱用して、readonly以外のオブジェクトグラフを作成します。だからジャレッドの声明はまだ完全に真実です。

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

これはありません。 Readonlyは、フィールド自体が指しているものではなく、フィールド自体を変更します。オブジェクトは、ルートされなくなった時点で収集されます。 –

+0

読み取り専用でオブジェクトが収集されないようにするプログラムの例が見つかりました。 – CodesInChaos

+0

このプログラムは、 'Object'に' Dump'メソッドがないので、あなたがそれをコンパイルするのに気にしなかったことを示しています。また、 'Main'関数は静的ではなく、そうであれば' s1'と 's2'にアクセスすることはできません。 –

6

いいえ。 GCは、ルートされたオブジェクトから到達できないオブジェクトのメモリを再利用して動作します。 readonly修飾子は、このプロセスに影響を与えません。いくつかの読み取り専用フィールドを有するものを除いて同一であった2つのオブジェクトグラフは、同じやり方で収集される。

0

readonlyはC#の機能です。 GCはCLI機能です。したがって、単にには影響しません。には、すべてに影響します。