1
struct a
{
   public string str;
}

a bb = new a();

class a
{
   public string str;
}

a bb = new a();

クラスは常にガベージコレクションされると言うのは正しいですか? 構造体はメモリに (永久に) 保持されますか?

4

4 に答える 4

4

はい。structが参照型のオブジェクトのフィールドの場合、ヒープに格納され、ガベージ コレクションの対象になります。

于 2013-01-08T17:37:09.343 に答える
4

編集->コメントに関する議論に続いて回答が更新され、ロブが共有するリンク

structです。通常、ヒープ上に個別のメモリは割り当てられません。通常、ガベージ コレクションは必要ありません。

ただし、例外があります。メモリ割り当ては、値型に割り当てられたスタックまたは参照型に割り当てられたヒープであるとは限りません。詳細については、他の SO の質問に対するこの回答実装の詳細のスタックをお読みください。

メンバー変数として何らかの参照型がある場合struct、参照型は (次のガベージ コレクション トリガーで) ガベージ コレクションさstructれます。

あなたの例では、参照型stringとして使用しています。intern poolを使用して異なる方法で処理されます。String

于 2013-01-08T17:38:13.657 に答える
2

構造体の例で文字列がメモリに残るかどうかという質問の場合、答えはノーです。構造体のメンバーは、他のオブジェクトと同様に、スコープを離れるとガベージ コレクションの対象になります。

.NET GC は、マーク アンド スイープ アプローチを使用して、スタック上の静的フィールド、既存のオブジェクト、およびローカル変数によってポイントされているオブジェクトを調べます。

ローカル変数の構造体はスタック上にあるため、通常どおりスイープされます。ヒープ上のオブジェクト メンバーの構造体も、GC がオブジェクト ツリーを通過するときにスイープされます。静的メンバーについても同様です。

つまり、構造体はクラスと同じ方法でスイープされます。それらの唯一の違いは、それらの保管方法です。構造体は変数ごとに保存されますが、クラスは参照として保存されます。どちらの方法も GC の対象です。

于 2013-01-08T17:47:28.730 に答える
0

私が正しく知っていれば、はい、C#では両方ともガベージコレクトされています。

ヒープに保存するかスタックに保存するかは、型ではなく変数/インスタンスの有効期間に依存します。

考慮すべきことの 1 つは、サブスクライブされたイベント ハンドラーなどのより複雑な状況がクラスのインスタンスに存在する場合です。その場合、ガベージ コレクターは収集をスキップし、インスタンスはメモリに存在する可能性があります。ただし、文字列型が 1 つしか宣言されていないため、上記の例はおそらく収集されます。

于 2013-01-08T17:49:13.427 に答える