2016-10-18 16 views
2

私はC#メモリ管理について質問があります。あなたは、クラスBは中クラスAの新しいインスタンスを作成し、見ることができるようにC#メモリ管理

public class B 
{ 
     public StringBuilder sb; 

     public B() 
     { 
      A a = new A(); 
      sb = a.sbOne; 
     } 
} 

public class A 
{ 
    public StringBuilder sbOne = new StringBuilder(); 
    public StringBuilder sbTwo = new StringBuilder(); 
    public StringBuilder sbThree = new StringBuilder(); 
} 

そして、もう一つのStringBuilderオブジェクトを持つ別の単純なクラス:私は3つのStringBuilderオブジェクトを持つ単純なクラスを持っている想像してみてそれはコンストラクタであり、StringBuilderフィールドをa.sbOneに代入します。この状況でどのようにメモリが解放されますか? a.sbTwoとa.sbThreeは、それらへの参照がないため、ガベージコレクションの対象となりますか?または、sbOneフィールドがまだ参照されているので、それらは離れているので、それらはメモリに保持されますか?

EDIT:DateTimeが構造体であるため、DateTimeをStringBuilderに変更するように編集されました。クラスであると仮定していました。

+4

「DateTime」は* value *型であることに注意してください。ここには別のオブジェクトはありません...参照型を使用するようにサンプルを変更しますか? 'StringBuilder'かそれとも何か? –

+0

Jon Skeetは、 'date'が' a.dateOne'への参照ではないことを意味します。 'DateTime'は構造体であるため、' a'は 'a.dateOne'の* copy *です。 –

+0

私のせいです。私はDateTimeがクラスであり、構造体ではないと仮定していました。私の悪い。はい、代わりに同じ質問をStringBuilderと仮定します。 – mesman00

答えて

3

タイプAのオブジェクトが作成された場合、オブジェクトがコレクションに適格でない限り、プロパティ/フィールドのいずれもコレクションに適格ではありません。例えば:

A a = new A(); 

収集することができないaへの参照、a.sbOnea.sbTwoa.sbThreeのいずれも存在しなくなるまで。

2番目の例では:

public class B 
{ 
     public StringBuilder sb; 

     public B() 
     { 
      A a = new A(); 
      sb = a.sbOne; 
     }//when this is reached the entire object a is eligible for collection 
} 

そしてaを収集することができる場合でも、タイプBの目的は、完全に分離されるので、Bクラスオブジェクトにsbに保持された参照は、影響を受けませんa

+0

ありがとうございました。以下のrory.apの回答に加えて、私は必要な情報を手に入れました。 – mesman00

0

DateTimeはstruct/valuetypeなので、date = a.dateOne;を実行するとdatetimeのコピーが作成されます。コンストラクタが終了すると、Aのインスタンスは保持されません。それは収集するためにマークされます。

0

aは、コンストラクタB()が終了すると、フィールドa.sbTwoa.sbThreeとともにガベージコレクションされます。 Bインスタンス内のa.sbOneおよびsbによって参照されるインスタンスは、Bインスタンスがガベージコレクトされるか、sbを別のインスタンスに設定するか、またはnullに設定します。

+0

ありがとう。私はこれが当てはまると仮定していたが、安心を求めていた。 – mesman00