2

異なるコードが私のやり方とは異なる方法でパラメーターを宣言していることに気づきました。そうする特定の理由があるのか​​、それともそれが好みなのか疑問に思います。

私がこの関数を書いたとしましょう(異なるパラメーターを使用した単なる例)

function DoSomething(AHeight, AWidth: Integer; R: TRect): Boolean
begin
  //
end;

これは、次のように宣言された場合とどのように異なりますか。

function DoSomething(var AHeight, AWidth: Integer; const R: TRect): Boolean
begin
  //
end;

変数が読み取り/書き込み可能で、定数が読み取り専用であることは知っていますが、この方法でパラメーターを宣言すると、どのように違いが生じますか?

私にとって、両方の関数は、Height、Width、およびRectを提供する呼び出しコードを探していますが、2番目の関数は、新しい変数を宣言しているように見えます。

私はこれがとても簡単な答えになるだろうと感じています私は尋ねるのはばかげていると感じますが、もしあれば、違いが何であるかを知らなければなりませんか?

4

3 に答える 3

4

ドキュメントはこれを非常に明確に説明しています:

ほとんどのパラメーターは、値パラメーター(デフォルト)または変数(var)パラメーターのいずれかです。値パラメーターは値によって渡され、変数パラメーターは参照によって渡されます。これが何を意味するかを理解するには、次の関数を検討してください。

function DoubleByValue(X: Integer): Integer;   // X is a value parameter
begin
  X := X * 2;
  Result := X;
end;

function DoubleByRef(var X: Integer): Integer;  // X is a variable parameter
begin
  X := X * 2;
  Result := X;
end;

これらの関数は同じ結果を返しますが、2番目の関数(DoubleByRef)のみが渡された変数の値を変更できます。次のような関数を呼び出すとします。

var
  I, J, V, W: Integer;
begin
  I := 4;
  V := 4;
  J := DoubleByValue(I);   // J = 8, I = 4
  W := DoubleByRef(V);     // W = 8, V = 8
end;

このコードが実行された後、DoubleByValueに渡された変数Iは、最初に割り当てたのと同じ値になります。ただし、DoubleByRefに渡された変数Vの値は異なります。

値パラメーターは、プロシージャーまたは関数呼び出しで渡された値に初期化されるローカル変数のように機能します。変数を値パラメーターとして渡すと、プロシージャーまたは関数はそのコピーを作成します。コピーに加えられた変更は元の変数に影響を与えず、プログラムの実行が呼び出し元に戻ったときに失われます。

一方、変数パラメーターは、コピーではなくポインターのように機能します。関数またはプロシージャの本体内でパラメータに加えられた変更は、プログラムの実行が呼び出し元に戻り、パラメータ名自体がスコープ外になった後も存続します。

同じ変数が2つ以上のvarパラメーターで渡された場合でも、コピーは作成されません。これを次の例に示します。

procedure AddOne(var X, Y: Integer);
begin
  X := X + 1;
  Y := Y + 1;
end;

var I: Integer;
begin
  I := 1;
  AddOne(I, I);
end;

このコードが実行された後、Iの値は3になります。


ブラウザのブックマークにDelphi言語ガイドへのリンクを追加することをお勧めします。

于 2012-07-25T09:31:31.530 に答える
2

ここでこの問題についての素晴らしい議論がありますが、基本的にvar、パラメータがない場合は値によって渡され、 。があるvar場合はパラメータが参照によって渡されます。

パラメータが値によって渡されると、パラメータのコピーが作成され、そのコピーが関数に渡されます。コピーへの変更は、別のオリジナルには反映されません。

パラメータが参照によって渡されると、関数には元の値への参照が与えられるため、呼び出しが行われた後でも、コピーへの変更はすべて表示されます。

于 2012-07-25T09:32:11.717 に答える
1

パラメータには、var、const、out、および'none'を指定できます。

通常、パラメータは関数によって変更できますが、呼び出し元のパラメータは変更されません。

var
  x,y : Integer;
procedure Text(a: Integer);
begin
  x := a;
  a := 1;
end;
begin
  x := 10;
  y := 20;
  Test(y);
  // x = 20; y = 20;
end.

varパラメーターを使用すると、変更は呼び出し元のパラメーターに影響します。

var
  x,y : Integer;
procedure Text(var a: Integer);
begin
  x := a;
  a := 1;
end;
begin
  x := 10;
  y := 20;
  Test(y);
  // x = 20; y = 1;
end.

constパラメータは変更できません。

var
  x,y : Integer;
procedure Text(const a: Integer);
begin
  x := a;
  a := 1; // ERROR!
end;
begin
  x := 10;
  y := 20;
  Test(y);
  // Does not compile
end.

outパラメータは書き込まれるだけです。

var
  x,y : Integer;
procedure Text(out a: Integer);
begin
  x := a;
  a := 1;
end;
begin
  x := 10;
  y := 20;
  Test(y);
  // x = undefine y = 1;
end.
于 2012-07-25T09:37:06.307 に答える