2011-07-31 14 views
2

別のtopicでは、すてきな男がエリック・リッペルトの言葉で私に語った:静的な意味は、コンパイラが特定のクラス/構造体/フィールドのコンパイル時に持っている知識と確実性と関係がある。メモリの場所や固定されているかどうかは関係ありません。とにかく静的なメンバーは移動可能か固定ですか?

コンパイラでは以下のようなことが起こるので、私はまだ確信していません。

 struct MyStruct 
     { 
      public static int[] Arr = {1,3,5}; 
     } 
     static void Test<T>(ref T t) where T:struct 
     { 
      Console.WriteLine (t); 
     } 
     void Main() 
     { 
      Test(ref MyStruct.Arr[2]);//output: as expected 5 
     } 

refの引数は全く別のものは、C++の参照に比較したり、シーンのピンの背後にいくつかの引数は参照によって渡されるたびに発生していますか?静的メンバーが移動可能な場合、ランタイムは配列要素のアドレスが呼び出された関数の実行中に変更されないことをどのように保証しますか?私は実験から、 '配列以外のItem prop'というオブジェクトの戻り値がbyrefを渡すことができないことを学びました。配列要素は連続したメモリのまとまりに割り当てられているためだと思いましたが、配列全体が移動可能な場合は、どのように要素のアドレスを取ることができますか?

私はこの不確実性によってちょっと固まっています。もし誰かが何らかの答えを出すことができたら、私はとても感謝しています。前もって感謝します!

~~~~~~~~~~~~~~~~~~

それを理解しようとすると:

ので、任意の管理操作を限り、コンパイラは、それが起こることができるよう、私たちは、それを汗ばむべきではないでしょうか?私はいくつかのC/C++のバックグラウンドを持っていますが、私はC++の "静的な"意味をよく理解していると思います。任意の管理オブジェクトは、スタックや管理されたヒープに関係なく、いつでもref argが常に正しくポイントすることができます。

+0

静的な意味は、オブジェクトに適用されたときとは違って、メンバ関数に適用されると意味が異なるためですメンバーは記憶を取ります。 [Lippert氏の見解](http://blogs.msdn.com/b/ericlippert/archive/2007/06/14/calling-static-methods-on-type-parameters-is-illegal-part-one .aspx)はメソッドのみを参照していました。 –

+0

オブジェクトが再配置されると、そのオブジェクト(およびそのオブジェクトに含まれるオブジェクト)へのすべての参照も更新されます。それが彼らが参照であり、アドレスではない理由です。 –

答えて

4

C#のリファレンスはC++のリファレンスと全く異なるわけではありませんが、この点では異なります。

C#ref引数はガベージコレクタに認識され、オブジェクトを別の世代に昇格させる場合には調整されます。

C++参照は.NETガベージコレクタには表示されません。ターゲットが固定されていてガベージコレクタが実行されていると、C++参照は破損します。

は、静的メンバが移動している場合は、どのようにランタイムは配列要素のアドレスは、実行中に変更されない保証はない

(C++/CLIは、.NET参照とネイティブの参照の両方をサポートしています)いわゆる関数ですか?

これはありません。しかし、関数は.NETコードでもあるため、更新されたアドレスを使用します。

これは、配列を参照する静的フィールドがあるかどうかによって変わりません。 (実際には配列自体は静的ではなく、それを参照するフィールドのみです)。

+0

参照オブジェクトが移動されたときはいつでも調整されますか?私はそれを正しくしていますか?ありがとう! – Need4Steed

+0

@ Need4Steed:それは正しいです。 –

関連する問題