web-dev-qa-db-ja.com

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

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

18
Neo

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

32
Mason Wheeler

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

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

7
Robert Harvey

あなたが尋ねた。

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

そして答えは、それらは必須ではないということです、Javaはどちらも持っておらず、VBは参照のみを持っています(そしてメソッドでそれを必要とするだけです宣言)。

どちらも使わなくても、プログラム全体を簡単に作成できます。

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

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

2
jmoreno

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

通話の反対側からも同様の違いがあります。このメソッドのoutパラメータには、到着時に役立つ情報が含まれているとは限らないため、ある時点で値を設定する必要がありますが、refパラメータには値があると見なすことができます。何か特別なことをする必要はありません。

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

使用法に関して:原則として、変数として渡されたときの変数の内容を気にしない場合はoutを使用し、到着したときはrefを使用します。

1
Corey