为什么在过程中使用局部变量而不是var参数?

nfc*_*fc1 8 delphi

o在Delphi中,SysUtils是一个ScanBlanks程序:

procedure ScanBlanks(const S: string; var Pos: Integer);
var
  I: Integer;
begin
  I := Pos;
  while (I <= Length(S)) and (S[I] = ' ') do Inc(I);
  Pos := I;
end;
Run Code Online (Sandbox Code Playgroud)

我想知道为什么程序使用I变量.我们不能Pos直接使用use var吗?

procedure ScanBlanks(const S: string; var Pos: Integer);
begin
  while (Pos <= Length(S)) and (S[Pos] = ' ') do Inc(Pos);
end;
Run Code Online (Sandbox Code Playgroud)

是因为一些速度/内存惩罚?更有经验的人可以解释一下原因/差异吗?

小智 3

除了性能之外,在编写良好的代码中,这两个函数之间没有任何区别。

然而,在编写糟糕的代码中,存在巨大差异。使用局部变量可以容易地推断函数的正确性。S记忆中存在着重叠的可能性PosInc(Pos);您是否想预测如果修改字符串的内容或长度,过程将如何表现?

使用局部变量可以很容易地准确地看到会发生什么。我当然同意拥有SPos重叠将是对过程的可怕误用,但是过程的行为应该符合其规范,因此规范应该不允许这样的输入值,或者即使存在存在过程也应该按照指定的方式运行这样的输入值。获取什么有效、什么无效的精确细节是很棘手的。使该过程在所有情况下都按照指定的方式工作是很容易的。