varで宣言されたパラメータと で宣言されたパラメータの違いは何outですか? コンパイラはそれらをどのように異なる方法で処理しますか (たとえば、異なるコードを生成するか、発行する診断を変更することによって)? それとも、異なる修飾子は、プログラマーがパラメーターの使用目的を文書化できるようにするだけですか? パラメータの型は問題にどのような影響を与えますか?
3 に答える
varパラメータは参照によって渡されます。それだけです。
outパラメーターも参照によって渡されますが、入力値は無関係であると見なされます。マネージ型 (文字列、インターフェイスなど) の場合、コンパイラは、ルーチンの開始前に変数をクリアすることでこれを強制しますparam := nil。アンマネージ型の場合、コンパイラはoutと同じように実装しvarます。
管理パラメーターの消去は呼び出しサイトで実行されるため、関数用に生成されたコードはパラメーターによって変化しないことに注意してoutくださいvar。
コンパイラにとっては、大きな違いはありません。それについてはメイソンの答えを見てください。
意味的には、大きな違いがあります。
varルーチンが現在の値で動作する可能性があることをプログラマーに伝えます。outルーチンが現在の値を無視/破棄することをプログラマーに伝えます。
少し遅れましたが、記録のために、 varまたはoutが大きな違いを生むケースに出くわしました。
私は、次のメソッドをエクスポートする SOAP Web サービスに取り組んでいました。
function GetUser( out User :TUser ) :TResult;
これは、C# に同等のものとしてインポートされていました。
function GetUser( out Result :TResult) :TUser;
outをvarに変更すると、正しくインポートされました。
Delphi SOAP インボーカは関数の結果をoutパラメータとして扱い、2 つのoutパラメータがあると Delphi SOAP ルーチンが混乱するのではないかと推測しています。outパラメータを使用できるようにする回避策があるかどうかはわかりません。