C#にoutとrefの両方があるのはなぜですか?


18

C#にはoutand refキーワードがあります。なぜこれら2つが必要なのですか?免責事項:C#の深い知識はありません。


3
Stack Overflowにクロスサイトの重複はありませんか?
ピーターモーテンセン


2
あなたは違いを求めているrefout?または、値渡し引数と比較して、参照引数ref/ の使用法を尋ねていoutますか(パラメーターの修飾子はありません)?または両方?
ジェッペスティグニールセン

1
この質問は似ていると思いますが、少なくとも言語設計の観点から取られている場合は、かなりの
重複ではありません-jmoreno

回答:


32

実装面では、それらは本質的に同じものですが、そうoutrefはないことを伝えます。入力は気にしません。 これは、あなたとツールにとって特定のことを意味します。たとえば、初期化されていない変数をoutパラメーターに渡すことができますが、そうでない場合は問題ありません。関数内では、outパラメーターが値を返す前に割り当てる必要がありますが、何もする必要はありませんすべてref値付き。


10
Ref vs outは、プログラマにとってよりもコンパイラにとってはるかに重要です。コンパイラーは、値が割り当てられる前に変数を読み取らないようにする義務outがあり、最初に変数を処理する方法により適した方法を提供します。
コートアンモン-復帰モニカ

について詳しく説明してください。「out」は「ref」では伝えられない何かを伝えます。
ネオ

4
@Neo:基本的に答えで言ったこと:入力にこれを使用することは気にしないことを伝えます。したがって、初期化されていない値をoutパラメータに渡すことは安全です。
メイソンウィーラー

@MasonWheelerただし、これは検証者によって許可されていますか(および/または受信側で強制されていますか)?Outは内部的には単なる属性です。
Random832

@ Random832:として、ロバートはでこれを議論し、彼の答えの下でエリックリペット(旧C#コンパイラの男)を見ている投稿stackoverflow.com/q/2876315
メイソンウィーラーを

7

これら2つのキーワードを理解するには、参照渡しで値を渡すことの意味を理解する必要があります。基本的に、メソッドまたは関数内で渡すパラメーター変数を変更した場合、関数が終了してもその変数は変更された値を保持することを意味します。これをパラメータとして宣言するrefout、これを実現しますが、通常のパラメータ変数は、関数で変更した場合でも元の値を保持します。

唯一の間の違いrefoutつまりout、あなたが関数に渡す前に、変数を初期化する必要はありませんが、refありません。一方、関数内の変数に何かを割り当てる必要out ありますが、refそうではありません。


分散に関連する違いはありませんか?
単セル


2

あなたが尋ねました。

C#にはoutとrefがあり、これら2つが必要な理由です。C#の詳細な知識はありません。なぜoutおよびrefパラメーターが必要ですか?

そして、答えは、それらは必須ではなく、たとえばjavaにもrefがなく、VBにはrefしかありません(そしてメソッド宣言でのみ必要です)。

どちらも使わずにプログラム全体を簡単に書くことができます。

それらは時々役立つので存在します。1つだけでなく2つあるのは、このためです。「ここに何かあり、必要に応じて変更する」と「この値に新しい値を与える」を区別すると便利です。

他の言語は優先順位が異なるため、これらまたは同等の言語を含む場合と含まない場合があります。彼らは、どちらかが有用であるかどうかについても意見が異なる場合があり、そのため、どちらか一方を実装しないことを積極的に決定するかもしれません。


1

それらのコアの両方refoutに割り当てること-それは更新できるようにする方法に変数のアドレスを渡すためのメカニズムを提供するrefか、outパラメータは、呼び出し元のコンテキストに変数を更新します。それらが異なるところはout保証にあります:変数が更新されることを保証しますが、更新refしません。

通話の反対側からも同様の違いがあります。outメソッドへのパラメーターは、到着時に有用なものを含むことが保証されておらず、ある時点で値に設定する必要がありrefますが、パラメーターは値を持っていると想定することができ、特定のことをする必要はありません。

この違いはコード分析、生成、および最適化に影響を与えますが、ほとんどの場合、これはひどく明らかではありませんが、プログラムの動作に影響を与える可能性があります。コードジェネレーターは、呼び出しの直前まで変数の割り当てを延期できます。オプティマイザーは、契約などに基づいていくつかの操作をより効果的に並べ替えることができると判断する場合があります。

使用に関しては、一般的な規則としてout、変数としてパラメーターとして到着するときとそうするときに、変数の内容を気にしない状況で使用しrefます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.