別の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が常に正しくポイントすることができます。
静的な意味は、オブジェクトに適用されたときとは違って、メンバ関数に適用されると意味が異なるためですメンバーは記憶を取ります。 [Lippert氏の見解](http://blogs.msdn.com/b/ericlippert/archive/2007/06/14/calling-static-methods-on-type-parameters-is-illegal-part-one .aspx)はメソッドのみを参照していました。 –
オブジェクトが再配置されると、そのオブジェクト(およびそのオブジェクトに含まれるオブジェクト)へのすべての参照も更新されます。それが彼らが参照であり、アドレスではない理由です。 –