C#の原則REF内と外

昨年、CSDNは上に書かれ、今ではここに移動しました。

まず、問題を引き起こします

そう長くかかったREFOUTを、あなたは本当にそれらが同期して実際の値のパラメータがやらせに関与しているか理解できますか?

第二に、研究の前提

この問題を調べるために、前提は理解しているC#のパラメータを渡す方法の方法の中に:

:1.CLRは、2種類のサポート値型参照型を

     値のタイプ:値は、一般に、ヒープ上に格納されたフィールド・クラス・オブジェクトとして、スレッド・スタックに格納されています。

     参照タイプB:ヒープに格納されたオブジェクトインスタンスは、スレッド、ボックス化値型にスタック内の参照は、参照タイプにより変更することができます。

  

1  // 参照型表す
2  クラスの文献を
 3。 {
 4      プライベート INT _xを、
 5      公共の int型のX-
 6。     {
 7。         GET => _x;
 8          SET 
9。         {
 10              _x = 値;
 11          }
 12れる      }
 13れる }
 14  
15  静的 ボイドTestValAndRef()
 16  {
 17      // 第一の部分
18は、     INT A1 = 5。;
19      のvar REF1 = 新しい新しいREF()
 20は     、{
 21は          X- = 5。
22れる     };
 23である 
24      // 第二の部分
25      INT A2 = A1;
 26である      A2 = 10 ;
 27      のvar REF2 = REF1;
 28      ref2.X = 10 ;
 29 }

コードは、上記の場合、変数に格納されています。

図2に示す伝送パラメータに分割されている値で且つへの参照を渡す二種類。

CLR 3.、アウトとrefの使用は、同じILコードを生成し、「ビットに加えて、メタデータ(記録方法に指定が実行宣言またはREFれる)、全く同じ。

 

1  // 测试REF 
2  静的 ボイドたtestRef(REF 文献R)
 3  {
 4      R = 新しいREF()
 5      {
 6          X = - 1 
7      }。
8  }
 9  
10  // 测试アウト
11  静的 ボイド TESTOUT(アウト文献R)
 12  {
 13      、R = 新しいREF()
 14      {
 15          X = - 1 
16      }。
17  }
18  
19  静的 ボイドメイン(文字列[]引数)
 20  {
 21      のvar REF1 = 新しいREF()
 22      {
 23          X = 10 
24      }。
25  
26      たtestRef(REFのREF1)。
27      TESTOUT(アウトのRef REF2)。
28 }

上記のコードは、ILにコンパイルされています。

これは、IL TESTOUTのたtestRef同じおよび対応する方法を見ることができます!

CLR 4.は、プロセスパラメータと戻り値は、物事とパラメータを示すことと一致するように見えるが、これらの引数をスタックすることによって記憶されているが、実際に、仮引数および引数、すなわちされ、別々に格納されています二つの異なる変数。

第三に、研究課題

すべてのメソッドの1.CLRのデフォルトパラメータは値によって渡されます。

    A。値型の場合、値のコピーが渡されます。例えば、スレッドスタックA1の値:5

    B。参照型の場合、送信はオブジェクトへの参照である変化は(新しい新規のパラメータに格納された内部メソッド参照呼び出された場合、基準自体は、値によって呼び出しメソッド内の最大記憶された基準にパラメータを渡されます。そのオブジェクトまたは別のオブジェクトに恵まれ)、パラメータは、引数との接触を遮断するために、引数の後続の変更は動作しません。しかし、引用は、の事実を変更されていない場合は変更を行います引数は、変更を行いました。例えば、スレッドスタックREF1の値:オブジェクトの引用タイプ。

アウトrefまたはを使用する場合、値によってC#は参照によってパスとなり、2 Cと同様 A1は、私はここで考える対応REFであり、それから

    。値のタイプについては、それが基準値が渡され=>(アドレス値が値によって基準のタイプに、その類似理解されるであろう)&パラメータ、削除&残りのパラメータは、実際に固体であります人参は、その変更は常に引数の値であり、つまり、変更することはありません保存され、このパラメータを参照してください。例えば、A1のスレッドスタックを参照。

    参照型の場合、それは(オブジェクト参照のスタックアドレスのインスタンスへの参照点として理解することができる変数への参照が渡され、B。、人気トークが参照されるオブジェクトは、ここで渡し、スタック上のアドレスに記憶されています参考のためにアドレス)=>  パラメータ、従って物体内部の引数が使用される方法ではなく、コピーのリファレンスを呼び出すことを保証するため、すべての変更は、引数を変更するために行われます。例えば、REF1のスレッドスタックを参照。

 

必然的な省略は、間違った場所にご理解がある場合は、あなたに感謝し、以下のメッセージを残してください!

おすすめ

転載: www.cnblogs.com/xiaoxiaotank/p/11317517.html