2017-08-17 4 views
-3

:私たちが知っているようにオブジェクトへの参照を保持する変数は値型ですか?あなたは単純なクラス持っ

public class foo { 
    public object Property { get; set; } 

    public void AMethod() { 
     Property = new object(); 
     object x = Property; 
    } 
} 

を、プロパティプロパティは、オブジェクト参照を保持する隠しバッキングフィールドを持っています。問題は、バッキングフィールドが構造体のように扱われることですか?

スタックに割り当てられたxのメモリは何ですか?それはガベージを収集するのですか?メソッドが返ってきたら、それは解放されますか?

EDIT

テキストはコメントに収まらには長すぎるので、私はコメントで、ここで応答の代わりにしています。

私はxに興味があります。私は "ObjectReference"と呼ばれる.Netフレームワークのどのクラスも認識していません。すべての人が話しているのは、 "私はオブジェクトへの参照を持っています"ということで、参照を使ってオブジェクトのメソッドを呼び出します。

実際には、オブジェクトへの参照とオブジェクト自体は同じものではありません1 &。彼らは両方とも異なる記憶のチャンクを占めています。メソッドにパラメータとしてオブジェクトを渡すときは、オブジェクトを渡すのではなく、そのオブジェクトへの参照です。その参照は "ObjectReference"変数からスタックにコピーされます。

参考文献は非常に重要です。オブジェクトを使わずにオブジェクトを操作することはできません。 「this」(またはその中のオブジェクトのメンバにアクセスするときに暗黙の「this」)さえも、オブジェクトが占めるメモリの特定のチャンクへの参照です。

多くの人がリファレンスを別個のエンティティとして考えているとは思いません。彼らは遍在していて、オブジェクトなしでは何もできません。

ここで私が得ようとしているのは、ObjectReferenceクラスがあれば、それは構造体でしょうか?参照自体のメモリは構造体のように扱われるようです。

+1

xがメソッドがスコープ外になると解放されます。 xは基本的にPropertyに現在格納されているオブジェクト/値への参照を保持していました。 – Nkosi

+1

'x'か' Property'について質問していますか?または、「Property」の隠れたバッキングフィールド? – mjwills

+0

あなたは明らかに 'struct'と' stackに割り当てられた 'とはまったく無関係であることを知っています...ちょうど確認しています...(封筒の見積もりはヒープに割り当てられた' struct'の33%です) –

答えて

2

つまり、xのメモリがスタックに割り当てられていますか?

はい、objectへの参照を保持しているxためのメモリは、スタック上に割り当てられている - 非常にそれらを持っている言語のポインタのように。

ガベージコレクションは行われますか。メソッドが返ってきたら、それは解放されますか?

参照自体のメモリは、メソッドが戻るとすぐに解放されます。 xがそのオブジェクトへの最後のライブ参照である場合、参照されるオブジェクトはガベージコレクションの対象となります。

関連する問題