3

私は現在いくつかのC#コードを見ていますが、それがどのように機能するかを理解するのに苦労していないことを確認したいと思いました。

これは、System.ServiceModel.Channels.Messageを渡すことと関係があります。Messageオブジェクトを受け取るすべてのメソッドには、次のようなメソッドシグネチャがあります。

void SomeMethod(ref Message message) { ... }

私が理解していないのは、なぜ「ref」キーワードがそこにあるのかということです。私の理解では、メソッドがオブジェクトを完全に置き換える予定がない場合は、それは必要ありません。

void SomeMethod(ref Message message)
{
    message = new Message();
}

ただし、たとえば、メッセージがヘッダーに何か他のものを追加する場合、またはオブジェクトから値を読み取る場合は、メッセージが参照型であるため、「ref」キーワードは必要ありません。

void SomeMethod(Message message)
{
    message.Headers.Add("Some Data");  // This should be fine?
}

乾杯

4

1 に答える 1

8

まず、あなたはおそらく正しいです。コードを書いた人が誤って「ref」を追加した可能性があります。

この機会を利用して、「ref」の意味を明確に理解していただきたいと思います。「この変数のエイリアスを作成する」という意味です。つまり、あなたが言うとき:

M(ref string x) { x = null; }
N(string x) { x = null; }
...
string y = "abc";
N(y);
M(ref y);

toの呼び出しは、yにある参照のコピーを作成し、その参照をxに配置することN(y)を意味します。xとyを意味するの呼び出しは、両方とも同じ変数の名前になりました。つまり、のエイリアスになります。M(ref y)xy

キーワードとして「ref」を選択したのは非常に残念です。参照型と値型についてすぐに混乱してしまうからです。参照型や値型とは何の関係もありません。 「ref」は「別の変数を参照している」という意味です。

refとの違いは、呼び出しの前にエイリアス変数を初期化する必要があるoutだけであり、そうではありません。(どちらも、呼び出しが正常に完了した後に変数が初期化されることを保証します。)refout

于 2012-04-19T16:13:52.840 に答える