var
で宣言されたパラメーターとout
で宣言されたパラメーターの違いは何ですか?コンパイラはどのようにそれらを異なる方法で処理しますか(たとえば、異なるコードを生成するか、発行する診断を変更することによって)?または、異なる修飾子は、プログラマーがパラメーターの使用目的を文書化できるようにするだけですか?パラメーターのtypesは、物質にどのような影響を与えますか?
var
パラメーターは参照によって渡され、それだけです。
out
パラメーターも参照渡しされますが、入力値は無関係であると想定されています。マネージ型(文字列、インターフェイスなど)の場合、コンパイラはこれを強制します。ルーチンを開始する前に変数をクリアすることにより、param := nil
。アンマネージ型の場合、コンパイラはout
と同じようにvar
を実装します。
マネージパラメーターのクリアは呼び出しサイトで実行されるため、関数に対して生成されるコードはout
またはvar
パラメーターによって変化しないことに注意してください。
つまり、コンパイラにとっては大きな違いはありません。 メイソンの答え を参照してください。
意味的には、大きな違いがあります。
var
は、ルーチンcouldが現在の値で動作することをプログラマーに伝えます。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パラメータを使用できるようにする回避策があるかどうかはわかりません。