1. ホーム
  2. c#

[解決済み] C#でrefを使うときと使わないとき

2022-09-20 22:54:33

質問

プログラムのインメモリ状態であるオブジェクトがあり、状態を変更するためにオブジェクトを渡す他のワーカー関数があります。私はそれをrefでワーカー関数に渡してきました。しかし、私は次の関数に遭遇しました。

byte[] received_s = new byte[2048];
IPEndPoint tmpIpEndPoint = new IPEndPoint(IPAddress.Any, UdpPort_msg);
EndPoint remoteEP = (tmpIpEndPoint);

int sz = soUdp_msg.ReceiveFrom(received_s, ref remoteEP); 

混乱するのは、両方とも received_sremoteEP は関数から何かを返しています。なぜ remoteEP が必要なのでしょうか? refreceived_s はないのですか?

私もcプログラマーなので、ポインタが頭から離れず困っています。

編集します。 C#のオブジェクトは、フードの下にあるオブジェクトへのポインタであるように見えます。そのため、オブジェクトを関数に渡すと、ポインタを通してオブジェクトの内容を変更することができ、関数に渡されるのはオブジェクトへのポインタだけなので、オブジェクト自体はコピーされません。 関数内でオブジェクトを交換したり、新しいオブジェクトを作成したりしたい場合は、ダブルポインタのような ref や out を使用します。

どのように解決するのですか?

簡単な答え:私の の記事を読んでください。 .

長い答え:参照型のパラメータが値で渡される場合、参照だけが渡されます。 ではなく オブジェクトのコピーではありません。これは、CまたはC++でポインタを(値で)渡すようなものです。パラメータ自体の値の変更は呼び出し側には見えませんが、参照が指すオブジェクトの変更は を指すオブジェクトの変更は見られます。

パラメータ(種類を問わない)が渡されたとき によって 参照で渡される場合、パラメータへの変更はすべて呼び出し元で見られることを意味します。 への変更は変数への変更となります。

もちろん、記事ではこれらすべてをより詳細に説明しています :)

役に立つ回答 ref/outを使う必要はほとんどないでしょう。 . それは基本的に別の戻り値を取得する方法であり、それはメソッドがおそらく多くのことをしようとしていることを意味するので、通常は避けるべきです。それは常にそうとは限りません ( TryParse などが妥当な使い方の典型例です。 out を使用することは相対的に稀であるべきです。