2009-05-08 8 views
7

C#を使い始めたとき、リファレンスが正確に扱われたかどうかはわかりませんでした(値渡しなど)。私は間違って、 'ref'キーワードが呼び出されたメソッドによって変更されるオブジェクトを渡すときに必要と考えた。'ref'キーワードとAppDomains

thisのようなスレッドを読んだあと、実際の参照/ポインタ自体を変更する必要がある場合にのみ、「ref」が必要であることを認識しました。

しかし、今日は、オブジェクトの内容を変更するためにrefが実際に必要だったリモーティング呼び出しでパラメータを渡すときに問題が発生しました。 refなしで渡されると、オブジェクトは変更されずに戻ります。私はrefキーワードを追加するように言われましたが、指摘されている内容ではなく、ポインタ自体を変更する必要があると私はしばらく主張しました。

私はネットを検索しましたが、簡単に説明しているsingle pageしか見つかりませんでした。これは既知の問題ですか?誰かがそれについてのいくつかのドキュメントを指すことができますか?私は、リモート呼び出しを介して変更されているパラメータについては、今すぐrefを使用しなければならないと思われます。

答えて

4

「ref」を追加すると、そうでないかもしれないし、役に立たないかもしれない。それはすべて、特定のマーシャラー実装のスマートさに依存します。たとえば、Webサービスを呼び出すと、「ref」の量はあなたを助けません - 関数のパラメータは単にワイヤを介して戻されません。サービスから戻ってくる唯一のものは、関数の戻り値です。リモート処理を扱うときは、実際には実際に動作する方法(ある程度は)を理解する必要があります。つまり、パラメタをシリアル化して、ある種の「ワイヤー」を介して呼び出し先に送信し、逆シリアル化し、サーバーによって実行され、結果がシリアライズされて返されます。これらの結果が最初に渡されたパラメータの変更を含むかどうかは、具体的なリモート実装、さらにパラメータを装飾するために追加する「ref」に依存します。

+2

SOAP(asmx)とWCFの両方のWebサービスが両方向でマーシャルすることで、期待通りに "ref"を処理できることは間違いありません。 –

1

「リファレンス/ポインタ」とは何故ですか?これらの用語には大きな違いがあります。参照:ポインタはちょうどアドレス、例えばintです。

一方、参照は何かのエイリアスにすぎません。 C++に関して:

int x; 
int& y = x; 

ここから、xに起こることは何でも、yとviceversaに起こり、「永遠に」バインドされます。 C++で再び

、パスごとREF:これは、Yは、FOOの範囲内のxのちょうど別の名前(エイリアス)であることを意味する

​​

。これはC#でのrefの意味です。

+0

これはRefの意味ですが、どのような参照が意味する。私は、C++をミックスに導入することは混乱を招くと思います。なぜなら、C++リファレンスはC#リファレンスと同じものではないからです。 –

+0

私は 'reference/pointer'というだけで 'reference'よりも、私が実際の参照について言及していて、参照が参照していたオブジェクトではないことを強調しています。人々が文章を二重に読まなくて済むように助けるかもしれないと思った。 – LegendLength

関連する問題