2012-04-05 6 views
0

値型と参照型の一般的な違いを知っていますが、参照型で値型を使用するときは、この値の型は実際にはヒープ上にあります。値の型をパラメーターとして使用しているときのメモリ位置の意味

例:

ClassA a = new ClassA(); 

日付1は、ヒープ

上にあるときに我々はこの方法でパラメータとしてこの日付1を使用する場合

class ClassA{ 
    public DateTime date1 = new DateTime(2008, 3, 1, 7, 0, 0); 
} 

私の質問は何だ、

ですメモリの場所の動作?

public void methodA(DateTime dt) 
{ 
//do sth with the dt 
} 

方法に呼び出す

methodA(new ClassA().date1); 

オプション1:ちょうどコピー1つの日付1参照 オプション2:「真実を読んだ後 :

UPDATEを実行するか日付1データをコピー私の前提にはいくつかの不確実性があることに気付きました。少なくとも、私は文脈のようなものを与えるべきです。デスクトップのCLR上のMicrosoftのC#実装では、値がラムダまたは匿名メソッドのクローズオーバーローカル変数ではないローカル変数または一時変数である場合、値タイプはスタックに格納され、メソッド本体はスタックには格納されませんイテレータブロックであり、ジッタはその値を登録しないことを選択します。

アップデート2: 私はこのことについて尋ねた理由は、私は(これだけ狂ったコード内の)構造体

にクラスからhttp://marcgravell.blogspot.co.uk/2011/10/assault-by-gc.html

変更カスタマーにいくつかのコードスニペットを理解したいですメインストアをリストから顧客に変更する

サブセットをリストからリストに変更します。具体的には、 をメインの顧客[]にオフセットします。

void SomethingComplex(ref Customer customer) {...} 
... 
int custIndex = ... 
SomethingComplex(ref customers[custIndex]); 
+0

値のタイプがどこにあるかについての前提は実装の詳細であり、必ずしも正しいとは限りません。 http://blogs.msdn.com/b/ericlippert/archive/2010/09/30/the-truth-about-value-types.aspx – Oded

+0

参照型でローカル変数として値型を使用すると、場合によっては、値の型もスタック上に存在できますか?あなたは例を挙げることができますか? – ValidfroM

+0

私はリンク先の記事を読むことをお勧めします。ランタイムが今何をしているのかは、それが変わらないことを意味するわけではありません。ありがとう。 – Oded

答えて

1

DateTime値型であるので、値は、メソッド呼び出しにコピーされます。

+0

私は今、@Marc Gravellのブログhttp://marcgravell.blogspot.co.uk/2011/10/assault-by-gc.htmlに記載されているsthを理解できると思います。 – ValidfroM

関連する問題