web-dev-qa-db-ja.com

C#でByValを「実行」する方法

私が理解しているように、C#はパラメーターを参照によってメソッドに渡します。 VB.NETでは、これをByValおよびByRefで指定できます。デフォルトはByValです。

これはVisual Basic 6.0との互換性のためですか、それとも単なるランダムですか?また、C#で使用するものを指定するにはどうすればよいですか?値でパラメーターを渡すという考え方が好きです。

22

C#のパラメーターは、defaultによって値で渡されます。これを明示的にする修飾子はありませんが、ref/outを追加する場合、パラメーターは参照です。

ここでの通常の混乱は、次の違いです。

  • 値型を値で渡します(値型への変更は呼び出し側からは見えませんが、値型はとにかく不変でなければなりません)
  • 参照によって値型を渡す(値型への変更は呼び出し元に表示されますが、値型は理想的には不変である必要があります。非常に重要なので、2回言っておきます; p)
  • 値で参照を渡す(ref-typeのfields/propertiesへの変更は呼び出し元に表示されますが、reassigning新しい/別のオブジェクトへのref-typeはnotvisible)
  • 参照による参照の受け渡し(フィールド/プロパティの変更、および参照の再割り当ては呼び出し元に表示されます)
54
Marc Gravell

値渡しはC#のデフォルトです。ただし、渡される変数が参照型である場合は、値としてreferenceを渡します。これがおそらくあなたの混乱の起源です。

基本的に、値で参照を渡す場合、参照するオブジェクトを変更でき、これらの変更はメソッドの外部で持続しますが、変数に別のオブジェクトを参照させ、その変更をメソッドの外部で持続させることはできません。

13
Tim Goodman

C#のパラメーターは、デフォルトで "ByVal"が渡されます。別の動作が必要な場合は、「ref」または「out」を指定する必要があります。

7
Reed Copsey