4

値型変数には実際のデータが直接含まれ、参照型変数には実際のデータへの参照が含まれます。

私はこれを次のように考えています。

lhs は値型、rhs は参照型

ここに画像の説明を入力

左側で、 にコピーiするjと、新しいメモリ ロケーションが同じ元のデータ (45) で埋められます。

右側にコピーkするlと、新しいメモリ位置がオブジェクトへの参照で埋められます。この参照はメモリ内の実際のオブジェクトを指します。

今、私はこの参照型のコピーについて混乱しています。ここに少し異なるものがあります:

ここに画像の説明を入力

ここで、rhs のコピーはlと同じ場所を指しkます。

私の質問は1.「どちらが正しいですか?」それとも私が想像していた以上のものがありますか?

また、値の型は、ジッターが適合する方法に応じてヒープに割り当てることができます.2.参照型を強制的にスタックに割り当てることはできますか?

雑な画像編集ですみません。

4

7 に答える 7

2

どちらでもない、そして両方。問題は、C#言語自体で指定されていない実装の詳細について話していることです。

実際、スタックしかないマシンに対してプログラミングを行っている場合もあれば、レジスターを使用できる場合もあります。結局のところ、それはすべて実装の詳細にすぎません。現実に最も似ているモデルは、実行しているマシンアーキテクチャによって異なります。

于 2012-09-09T19:01:06.927 に答える
2

最初の図の方が優れてlおりk、さまざまな変数であり、メモリ内のさまざまな場所を占めています。

値の型は、ジッターが適合する方法に応じて、ヒープに割り当てることができます

実際には、コンテキストと値の使用方法に大きく依存します。値型フィールドは常にヒープに割り当てられます。ボクシングとクロージャーは他の理由です。

ただし、2 番目の図はlrefパラメーターの場合に適用されます。

MyClass k = new ...;
M(ref k);

void M(ref MyClass l) { /* Here l is an alias for k */ }

2.参照型を強制的にスタックに割り当てることはできますか?

stackalloc のようなものがありますが、これは C# プログラマーには「見えない」最適化です。
シンプルで最も有用な答えは、「いいえ」です。

于 2012-09-09T18:54:02.923 に答える
1

素敵な絵!最初のイメージは「真実」だと思います。これらは同じオブジェクトを参照しますが、参照を保存するには変数も必要です。参照またはポインタも変数です。つまり、それらには独自のメモリ位置があります。2. そうは思いません。(私はわかりません)

于 2012-09-09T18:55:18.617 に答える
0

あなたが考えるので、最初の写真は最も正しいです

l = k;

代わりにこの状況がある場合

class MyClass
{
  internal string k;

  internal void Test()
  {
    OtherClass.Method(ref k);
  }
}

class OtherClass
{
  internal static Method(ref string l)
  {
    // do a lot of stuff using l
  }
}

この場合、このパラメーターにはrefキーワードが含まれているため、2 番目の図の方が正しいと言えます。つまり、の実行中にk誰かが参照を別の文字列オブジェクトを指すように変更すると、突然、変数も新しいオブジェクトを指すようになります。OtherClass.Methodl

しかし、これはrefキーワードのためにのみ当てはまります。

于 2012-09-09T19:07:55.077 に答える
0

最初の写真は間違いなく...そうしないと、「by-ref」引数を使用した呼び出しが両方の参照に影響します。つまり、Xxx(ref k); k と l の両方を「リダイレクト」する可能性があります。

スタックなどについては、Eric Lippert ( The Stack Is An Implementation Detail )を参照してください。

于 2012-09-09T19:08:41.820 に答える
0
  1. 最初が最も正しいです。参照は番号であり、コピーするときはアドレスをコピーします。c では、実際に参照を整数に入れることができます。

  2. クラスの代わりに構造体を宣言すると、スタックに入れられます(私が覚えている限り)

于 2012-09-09T18:59:15.370 に答える