C#にはout
およびref
キーワードがあります。なぜこれら2つが必要なのですか?免責事項:C#に関する深い知識はありません。
実装に関しては、それらは基本的に同じものですが、out
はref
がしないことを伝えます:入力は気にしません。これは特定のことを意味しますあなたとツールに物事を。たとえば、初期化されていない変数をout
パラメータに渡すことができますが、それ以外の場合は問題ありません。関数内で、out
パラメータに値を割り当てる必要があります戻る前に、ref
値を使用して何もする必要はありません。
これら2つのキーワードを理解するには、値を参照渡しの意味を理解する必要があります。基本的に、これは、渡したパラメーター変数を変更した場合メソッドまたは関数内その変数関数の終了時に変更された値を保持しますパラメーターをref
またはout
はこれを実現しますが、通常のパラメーター変数は、関数で変更しても、元の値を保持します。
ref
とout
の唯一の違いは、out
では変数を関数に渡す前に初期化する必要がないことですが、ref
はそうです;一方、out
doesは、関数内の変数に何かを割り当てる必要がありますが、ref
では必要ありません。
あなたが尋ねた。
C#にはoutとrefがあり、これら2つが必要な理由。 C#についての深い知識がありません。なぜoutおよびrefパラメータが必要なのですか?
そして答えは、それらは必須ではないということです、Javaはどちらも持っておらず、VBは参照のみを持っています(そしてメソッドでそれを必要とするだけです宣言)。
どちらも使わなくても、プログラム全体を簡単に作成できます。
それらは時々役立つので存在します。これが、1つだけではなく2つある理由です。「ここに何かがある場合、必要に応じて変更する」と「これに新しい値を与える」とを区別するのに便利です。
他の言語は優先順位が異なるため、これらまたは同等の言語が含まれる場合と含まれない場合があります。どちらが有用かについても意見が分かれる可能性があり、どちらか一方を実装しないことを積極的に決定する場合があります。
コアでは、ref
とout
の両方が、変数のアドレスをメソッドに渡し、更新できるようにするメカニズムを提供します-ref
またはout
パラメータは、呼び出し元のコンテキストの変数を更新します。それらが異なるところは保証にあります:out
は変数が更新されることを保証しますが、ref
はそうではありません。
通話の反対側からも同様の違いがあります。このメソッドのout
パラメータには、到着時に役立つ情報が含まれているとは限らないため、ある時点で値を設定する必要がありますが、ref
パラメータには値があると見なすことができます。何か特別なことをする必要はありません。
この違いは、コードの分析、生成、および最適化に影響を与えますが、ほとんどの場合、はっきりとはわかりませんが、プログラムの動作に影響を与える可能性があります。コードジェネレーターは、呼び出しの直前まで変数の割り当てを延期できます。オプティマイザは、コントラクトなどに基づいて一部の操作をより効率的に並べ替えできると判断する場合があります。
使用法に関して:原則として、変数として渡されたときの変数の内容を気にしない場合はout
を使用し、到着したときはref
を使用します。