web-dev-qa-db-ja.com

「var」パラメータと「out」パラメータの違いは何ですか?

varで宣言されたパラメーターとoutで宣言されたパラメーターの違いは何ですか?コンパイラはどのようにそれらを異なる方法で処理しますか(たとえば、異なるコードを生成するか、発行する診断を変更することによって)?または、異なる修飾子は、プログラマーがパラメーターの使用目的を文書化できるようにするだけですか?パラメーターのtypesは、物質にどのような影響を与えますか?

55
Rob Kennedy

varパラメーターは参照によって渡され、それだけです。

outパラメーターも参照渡しされますが、入力値は無関係であると想定されています。マネージ型(文字列、インターフェイスなど)の場合、コンパイラはこれを強制します。ルーチンを開始する前に変数をクリアすることにより、param := nil。アンマネージ型の場合、コンパイラはoutと同じようにvarを実装します。

マネージパラメーターのクリアは呼び出しサイトで実行されるため、関数に対して生成されるコードはoutまたはvarパラメーターによって変化しないことに注意してください。

46
Mason Wheeler

つまり、コンパイラにとっては大きな違いはありません。 メイソンの答え を参照してください。

意味的には、大きな違いがあります。

  • varは、ルーチンcouldが現在の値で動作することをプログラマーに伝えます。
  • outは、ルーチンが現在の値を無視/破棄することをプログラマに伝えます。
8
NGLN

少し遅れましたが、記録のためだけに、varまたはoutが大きな違いを生むケースに出会いました。

私はSOAP以下のメソッドをエクスポートするWebサービスで作業していました。

function GetUser( out User :TUser ) :TResult;

に相当するものとしてC#にインポートされていました

function GetUser( out Result :TResult) :TUser;

outvarに変更すると、正しくインポートされました。

Delphi SOAP呼び出し元は関数の結果をoutパラメーターとして扱い、2つのoutパラメーターはDelphi = SOAPルーチン。outパラメータを使用できるようにする回避策があるかどうかはわかりません。

1
Steve