2017-01-14 8 views
1

タイトルが示唆するように、静的クラスが.NET、特にC#のメモリにロードされるときに興味があります。私は、Javaでthis question、静的メソッドに関してはthis questionに似ていると想定しています。最初に使用されるときに読み込まれるという点です。また、メモリに格納されると、アプリケーションが終了するか、ガベージコレクタがそれを使用したクラスをクリーンアップするときにクリーンアップされるまでそこにとどまりますか?.NETで静的クラスがメモリにロードされるのはいつですか?

静的なクラスが使用するメモリの量が少ないことは、8 GBのRAM標準を搭載したコンピュータの世界ではあまり重要ではないことを認識していますが、内部を知ることは常に面白いです。

編集:

答えは、私はこの質問に多くを追加し、例を明確にしたいつながりました。私が正しく理解している場合、以下の例でContraption.SomeStringが最初にContraption.AnotherStringに続いてメモリに配置されます。

public static class Contraption 
{ 
    public static string SomeString = "Some String"; 
    public static string AnotherString = "Another String"; 
} 

public class Processor 
{ 
    public void Process(List<SomeClass> items) 
    { 
     foreach(var item in items) 
     { 
      if(item.Name == Contraption.SomeString) 
      { 
       //do something 
      } 
      if(item.Name == Contraption.AnotherString) 
      { 
       //do something 
      } 
     } 
    } 
} 

答えて

2

静的フィールドの初期化に関しては、重要な点は、static constructorの使用です。 CLRにはクラスローダーコンポーネントがあります。クラスローダーコンポーネントは、クラス(メタデータ情報)をロードし、プログラムで使用されているメモリマネージャーにメモリ割り当てを要求します。メタデータの読み込みは1回のジョブで、必要なときにメモリを要求するだけです。

説明したように、静的なクラス変数は、クラスの最初の使用時にロードされ、メモリは割り当てられますが、静的コンストラクタは、クラスローダが呼び出されたときに最初のものとして、クラス内のすべての静的変数の初期化を行うことができる1回限りの呼び出しで初期化されることを保証できます。 mscoree.dll)は、指定されたプログラムのコンポーネントがロードされているかどうかを示します。

静的コンストラクタが例外があります場合でも、その非常に広く使われている、また、静的変数がnull

+0

静的なのでコンパイル時にメモリが割り当てられませんか?実行時に最初に使用されたとき?それはどこに保存されますか?スタックまたはHEAP? –

1

静的クラス(または非静的クラスの静的フィールド)内のフィールドを参照しているとします。最初の使用の前に初期化されます。 C#の明細書に記載されています:クラスの

10.4.5.1静的フィールドの初期化

静的フィールド変数初期化子は、それらが表示されるテキストの順序で実行されている割り当ての配列に対応しますクラス宣言で。静的コンストラクタ(10.11節)がクラスに存在する場合、静的フィールド初期化子の実行は、その静的コンストラクタを実行する直前に発生します。それ以外の場合、静的フィールド初期化子は、そのクラスの静的フィールドを最初に使用する前の実装依存の時間に実行されます。

静的クラスメンバーは、ガベージコレクションの根とすべて常に到達可能と考えられています。

public static class Foo 
{ 
    public static object Bar = new object(); 
} 

// somewhere later 
Foo.Bar = null; 
// the object can be collected now. 
+0

はいとして、それらを設定することによって収集することができ、(プログラムの再起動を除く)いかなる状況においても、初めての後に呼び出されることはありません。私はこれを投稿した後、静的クラスは静的メンバーを伴わずに無意味であることを実感しました。 –

+0

新しい文字列(「私の最初の文字列はここにあります)」とは何ですか? – PetSerAl

+0

@PetSerAlリテラル文字列と文字列インターンに関連するいくつかの複雑さがあります。 'new string()'を使うことはそれを回避することを意図していました。私はそれをむしろ混乱を少なくするためにオブジェクトに変更しました。 – MarcinJuraszek

0

静的変数は、アプリケーションドメインの有効期間持続、および.NETで、あなたが複数のAppDoaminsを持つことができます。

あなたはnullまたはその他のオブジェクトへの静的メンバーをリセットして再利用するオブジェクトを強制することができますアプリケーションごとに。ほとんどの場合、アプリケーションごとにAppDomainが1つだけですが、他のAppDomainsは主にサンドボックスプラグイン用に作成されます。

https://msdn.microsoft.com/en-us/library/2bh4z9hs(v=vs.110).aspx

関連する問題