58

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

4

3 に答える 3

48

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

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

管理パラメーターの消去は呼び出しサイトで実行されるため、関数用に生成されたコードはパラメーターによって変化しないことに注意してoutくださいvar

于 2013-01-24T17:38:57.693 に答える
11

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

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

  • varルーチンが現在の値で動作する可能性があることをプログラマーに伝えます。
  • outルーチンが現在の値を無視/破棄することをプログラマーに伝えます。
于 2013-01-25T10:26:21.673 に答える
2

少し遅れましたが、記録のために、 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パラメータを使用できるようにする回避策があるかどうかはわかりません。

于 2014-02-20T17:17:26.350 に答える