你应该not代替const
by var
。让我解释一下原因。
背景
function Add(a: integer): integer;
begin
result := a + 5;
end;
返回其参数 + 5。尝试ShowMessage(IntToStr(Add(10)))
。你也可以做a := 10; ShowMessage(IntToStr(Add(a)))
得到相同的结果。在这两种情况下,事物都会传递给函数Add
是数字10
.消息显示15
.
预期用途var
参数是这样的:
procedure Add(var a: integer);
begin
a := a + 5;
end;
var
指示参数变量应通过引用传递;也就是说,只有指向参数变量的指针应该传递给过程/函数。
因此,现在你可以做
a := 10;
Add(a);
ShowMessage(IntToStr(a)); // You get 15
Now you cannot甚至Add(10)
, since 10
根本不是变量!
比较,
function Add(a: integer): integer;
begin
a := a + 5;
result := a;
end;
不会影响a
. So,
a := 10;
ShowMessage(IntToStr(Add(a))); // You get 15
ShowMessage(IntToStr(a)); // You get 10
现在,考虑一下这个可怕的函数:
function Add(var a: integer): integer;
begin
a := a + 5;
result := a;
end;
这也会返回它的参数 + 5,但它也会影响它的参数(非常意外!!),并且除了变量之外你不能传递任何东西作为参数(所以Add(10)
行不通!!)!
a := 10;
ShowMessage(IntToStr(Add(a))); // You get 15
ShowMessage(IntToStr(a)); // You get 15 (!!!)
那么,什么是const
? Well, const
大致意思是“如果可能的话通过引用传递(以加快速度;例如,您不需要复制大记录),但永远不要接受对参数的任何更改”。因此,一个const
参数实际上与普通参数一样工作,只是你无法更改它:
function Add(const a: integer): integer;
begin
result := a + 5;
end;
工作同时
function Add(const a: integer): integer;
begin
a := a + 5;
result := a;
end;
甚至无法编译!但你仍然可以做Add(10)
.
相关案例
从这个讨论中,应该清楚你不应该替换const
by var
。的确,
- 如果你改变从
const
to var
,您的函数不再接受文字参数(10
) 或表达式 (Tag + 30
or SomeFunc(a, b)
). 这是一场重大的表演!
- 函数的未来实现可能会更改参数,这会意外更改作为参数传递的变量。
第一点的例子。 Using const
或普通参数:
function Complex(a, b: real): TComplex;
begin
result.r := a;
result.c := b;
end;
...
var
c, d: TComplex;
begin
d := -c; // Works!
d := -Complex(10, 20); // Works!
但使用var
:
var
c, d: TComplex;
begin
d := -c; // Works!
d := -Complex(10, 20); // [DCC Error] Unit5.pas(262):
// E2015 Operator not applicable to this
// operand type
这也不起作用(与var
):
var
a, b, c: TComplex;
begin
a := -(b + c);
确实,现在的论点是Negative
不是变量,而是表达式b + c
。所以你损失很大!
第二点的例子。假设你有一个糟糕的一天并且你糟透了实施Negative
to
class operator TComplex.Negative(var C: TComplex): TComplex;
begin
C.r := -C.r;
C.c := -C.c;
result := C;
end;
然后是下面的代码,
var
c, d: TComplex;
begin
c := Complex(10, 20);
d := -c;
ShowMessage(FloatToStr(c.r));
ShowMessage(FloatToStr(d.r));
这曾经导致消息10
and -10
,会突然改变并屈服-10
, -10
,这是非常出乎意料的!
结论
因此,您的情况的解决方案就是简单地删除const
完全(并且不将其替换为var
!).