[解決済み] C#でrefを使うときと使わないとき
質問
プログラムのインメモリ状態であるオブジェクトがあり、状態を変更するためにオブジェクトを渡す他のワーカー関数があります。私はそれを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_s
と
remoteEP
は関数から何かを返しています。なぜ
remoteEP
が必要なのでしょうか?
ref
と
received_s
はないのですか?
私もcプログラマーなので、ポインタが頭から離れず困っています。
編集します。 C#のオブジェクトは、フードの下にあるオブジェクトへのポインタであるように見えます。そのため、オブジェクトを関数に渡すと、ポインタを通してオブジェクトの内容を変更することができ、関数に渡されるのはオブジェクトへのポインタだけなので、オブジェクト自体はコピーされません。 関数内でオブジェクトを交換したり、新しいオブジェクトを作成したりしたい場合は、ダブルポインタのような ref や out を使用します。
どのように解決するのですか?
簡単な答え:私の の記事を読んでください。 .
長い答え:参照型のパラメータが値で渡される場合、参照だけが渡されます。 ではなく オブジェクトのコピーではありません。これは、CまたはC++でポインタを(値で)渡すようなものです。パラメータ自体の値の変更は呼び出し側には見えませんが、参照が指すオブジェクトの変更は は を指すオブジェクトの変更は見られます。
パラメータ(種類を問わない)が渡されたとき によって 参照で渡される場合、パラメータへの変更はすべて呼び出し元で見られることを意味します。 は への変更は変数への変更となります。
もちろん、記事ではこれらすべてをより詳細に説明しています :)
役に立つ回答
ref/outを使う必要はほとんどないでしょう。
. それは基本的に別の戻り値を取得する方法であり、それはメソッドがおそらく多くのことをしようとしていることを意味するので、通常は避けるべきです。それは常にそうとは限りません (
TryParse
などが妥当な使い方の典型例です。
out
を使用することは相対的に稀であるべきです。
関連
-
[解決済み】スクリプトクラスが見つからないので、スクリプトコンポーネントを追加できない?
-
[解決済み】C#はJavaのcharAt()と同等?)
-
[解決済み] DBNullから他の型にオブジェクトをキャストすることができない
-
[解決済み] 関数を終了するには?
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] IDisposable インターフェースの正しい使用法
-
[解決済み] async」と「await」の使い方とタイミング
-
[解決済み] キーワード「ref」と「out」の違いは何ですか?
-
[解決済み] LINQで.Firstと.FirstOrDefaultを使用するタイミングは?
-
[解決済み】オブジェクトを渡すときに'ref'キーワードを使用するのはなぜですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] メンバー '<メンバー名>' にインスタンス参照でアクセスできない
-
[解決済み】ASP.NET Core Dependency Injectionのエラーです。アクティブ化しようとしているときに、タイプのサービスを解決できません。
-
[解決済み】トランスポート接続からデータを読み取れない:既存の接続は、リモートホストによって強制的に閉じられました。
-
[解決済み】非静的メソッドはターゲットを必要とする
-
[解決済み] [Solved] アセンブリ System.Web.Extensions dll はどこにありますか?
-
[解決済み】Socket.Selectがエラー "An operation was attempted on something that is not a socket" を返す。
-
[解決済み】Unity 「関連するスクリプトを読み込むことができません」「Win32Exception: システムは指定されたファイルを見つけることができません"
-
[解決済み] ...基礎となる接続は閉じられました。予期しないエラーが受信で発生しました
-
[解決済み】ファイルやアセンブリ、またはその依存関係の1つをロードできませんでした。
-
[解決済み】Nullableオブジェクトは値を持たなければならない?