3

私はC#を介してJeffrey Richters CLRを読んでおり、その中で彼はrefパラメーターを使用して参照自体が値によって渡されると述べています。これは私には理にかなっており、ポインタに類似しているようです。

つまり、Cでポインタを関数に渡してから、mallocを介してポインタを割り当てると、新しいメモリ位置を指すようにポインタが変更されますが、ポインタ自体はコピーであるため、元のポインタは再割り当てされません。関数に渡されます。関数外のポインターへの変更を実行するには、ダブルポインターを使用する必要があります。

ただし、C#では:

void Swap(ref Object a, ref Object b)
{
    Object t = b;
    b = a;
    a =t ;
}

動作します。これは、参照が価値によるものではないことを私に示しています。上記のmallocと同様に、参照によってオブジェクトを渡し、それに新しいオブジェクトを割り当てることができ、再割り当ては関数の外部で持続すると想定しています。

誰かが私の混乱を解消できますか?

4

3 に答える 3

6

少しずれています。参照型では、参照値によって渡されますrefパラメータを渡す方法は異なります。の

private void Frob(Foo foo) // Foo is a class
{

}

呼び出しサイトの type のオブジェクトへの参照のコピーがFooメソッドに渡されFrobます。この参照のコピーは、値によって渡されます。この参照と呼び出しサイトでの参照は、メモリ内の同じオブジェクトを指しており、そのうちの 1 つがメモリ内の他のオブジェクトを指すまで継続します。たとえば、このメソッド内で次のように記述します。

foo = someOtherFoo;

その後、パラメーターは呼び出しサイトのオブジェクトと同じオブジェクトを参照しなくなります。呼び出しサイト参照は変更されません

refここで、キーワードを導入するかどうかを検討します。

private void Frob(ref Foo foo)
{
    foo = someOtherFoo;
}

この場合、fooは呼び出しサイトでの変数のエイリアスです。これらの変数は、単にメモリ内の同じオブジェクトを指しているのではなく、あたかも同じ変数であるかのようです! その結果、このメソッド内で指すfooことsomeOtherFooが変更されるだけでなく、この変更は呼び出しサイトにも反映されます。foo

于 2011-04-29T03:20:22.867 に答える
5

キーワードがないref場合、オブジェクトの参照は値によって渡されます。

キーワードを使用refすると、オブジェクトの参照への参照が値渡しされます。

[明示的に渡されたパラメーターへの割り当てを行うとrefポインターが変更されるという事実をコンパイラーが隠しているだけです]

于 2011-04-29T03:17:12.903 に答える
0

これが呼び出されると、元のポインター値 (参照) が渡されます。

void Swap(ref Object a, ref Object b)
{
    Object t = b;
    b = a;
    a = t;
}

これは、元のポインターのコピーを渡します。

void Swap(Object a, Object b)
{
    Object t = b;
    b = a;
    a = t;
}

どちらも同じオブジェクトを指しますが、2 番目を変更しても、このメソッドよりも大きなスコープには反映されません...

質問の意味がよくわかりませんが…

于 2011-04-29T03:20:25.033 に答える