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パラメータを使用できるようにする回避策があるかどうかはわかりません。