readonly修飾子はガベージコレクタの処理に影響を与えますか? 値の型は参照型ですか?readonly修飾子はガベージコレクタに影響しますか?
答えて
通常の使用で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
}
これはありません。 Readonlyは、フィールド自体が指しているものではなく、フィールド自体を変更します。オブジェクトは、ルートされなくなった時点で収集されます。 –
読み取り専用でオブジェクトが収集されないようにするプログラムの例が見つかりました。 – CodesInChaos
このプログラムは、 'Object'に' Dump'メソッドがないので、あなたがそれをコンパイルするのに気にしなかったことを示しています。また、 'Main'関数は静的ではなく、そうであれば' s1'と 's2'にアクセスすることはできません。 –
いいえ。 GCは、ルートされたオブジェクトから到達できないオブジェクトのメモリを再利用して動作します。 readonly修飾子は、このプロセスに影響を与えません。いくつかの読み取り専用フィールドを有するものを除いて同一であった2つのオブジェクトグラフは、同じやり方で収集される。
readonly
はC#の機能です。 GCはCLI機能です。したがって、単にはには影響しません。には、すべてに影響します。
- 1. スカラユニットテストのセットアップ(アクセス修飾子修飾子を使用しますか?)
- 2. 修飾子
- 3. アクセス修飾子
- 4. セッション修飾子
- 5. プロパティ修飾子
- 6. private修飾子
- 7. Cの修飾子と修飾子の違いは何ですか?
- 8. 修飾子のエラー
- 9. Gtk keypress修飾子
- 10. OpenGL:レイアウト修飾子?
- 11. パッケージ修飾子は、パッケージ修飾子でトップレベルのクラスを定義するとき
- 12. Dartの最後の修飾子は何をしますか?
- 13. regexpのo修飾子は何を意味しますか?
- 14. ローカルアクセス修飾子はいつ使用しますか?
- 15. ログはリストビューに影響しますか?
- 16. ガベージコレクションはスタックに影響しますか?
- 17. クローニングはアクティブレコードコールバックに影響しますか?
- 18. DOCTYPEはCSSに影響しますか?
- 19. 動的アクセス修飾子
- 20. CodeModel修飾子の順番
- 21. ResharperとNamespaceエイリアス修飾子
- 22. __device__修飾子の範囲
- 23. ConcurrentHashMap修飾子の同期
- 24. Java抽象修飾子
- 25. "Windows"キーのInputGesture修飾子
- 26. Delphiのアクセス修飾子
- 27. Vector3の方向は影響に影響しません
- 28. インライン修飾子はプロトタイプまたは定義に由来しますか?
- 29. 私は怒っていますか? c#/ static修飾子
- 30. JAVAの "threadsafe"修飾子はありますか?
可能性のある複製http://stackoverflow.com/questions/1152573/does-readonly-c-reduce-memory-usage –