2016-12-23 1 views
4

私はXのオブジェクトをインスタンス化するたびに、このフィールドがロードされるか、またはロードされることに気づいた(メモリの点で)大きなサイズのフィールドメンバyを持つclass Xを持っています。メモリに再ロードされます。 yの基礎構造は、約5000kvsを保持するdictionary<string,int>です。 yを別の明示的な辞書として宣言する方法はありますか?アプリケーションライフタイム中にそれを生かしておきますか?C#でオブジェクトを存続させている

注意:Xのオブジェクトは実行時に処理することができるので、より正確な質問があります:ディクショナリがクラスの静的メンバーとして宣言されている場合、クラスのオブジェクトがゴミ収集されたか明示的に破壊されたか

+3

静的メンバーは、アプリケーションの有効期間中は生き続ける。フィールドがリロードされたことにどのように気付きましたか? –

+2

どうやってこれを知ることができましたか? 'Xのオブジェクトをインスタンス化するたびに、このフィールドはメモリに読み込まれるか、読み込まれますか?静的フィールドは、初期化されるか、またはその生涯に一度だけロードされます。 – RBT

+1

"私はXのオブジェクトをインスタンス化するたびに、このフィールドがロードされるか、メモリに再ロードされることに気付きました" - あなたのコンストラクタを表示できますか?あなたが 'y = new dictionary 'を持っていれば私は好奇心です。(){etc ..}' – Quantic

答えて

6

ディクショナリ変数のリロード/再インスタンス化を引き起こしているクラスのインスタンスコンストラクタで静的フィールドを再インスタンス化しています。それは

static Dictionary<string, int> y = new Dictionary<string, int>() {kvs}; 

または静的コンストラクタで

static Dictionary<string, int> y; 
static myClass() 
{ 
    y = new Dictionary<string, int>() {kvs}; 
} 

クラスの静的コンストラクタまたは静的フィールド初期化子は一度だけ実行するクラスで宣言される静的フィールドのいずれかでラインを初期化彼らの生涯で。

+2

私は小さな疑問を抱いています。ディクショナリがクラスの静的メンバーとして宣言されている場合、クラスのオブジェクトがガベージコレクションされたり明示的に破棄された場合、静的メンバーはメモリ内に残りますか? – Alrehamy

+1

はい。クラスの静的メンバーは、 '型インスタンス 'として知られるクラスの特別なインスタンスで保持されます。 'Type Instance'は、アプリケーションドメインをアンロードしたときにのみガベージコレクトされます。 – RBT

+2

静的メンバーは型定義の一部であり、インスタンス(オブジェクト)メンバーではありませんので、メモリに残っています –

関連する問題