Delphi:for循环期间函数结果未清空
Posted
技术标签:
【中文标题】Delphi:for循环期间函数结果未清空【英文标题】:Delphi: function Result not emptied during for loop 【发布时间】:2011-07-03 10:28:27 【问题描述】:这正常吗?
for a := 1 to 10 do
x.test;
x.test;
x.test;
x.test;
function test: string;
begin
$IFDEF DEBUG DebugMessage('result check = '+Result,3); $ENDIF
result := result + 'a';
end;
10:39:59: result check =
10:39:59: result check = a
10:39:59: result check = aa
10:39:59: result check = aaa
10:39:59: result check = aaaa
10:39:59: result check = aaaaa
10:39:59: result check = aaaaaa
10:39:59: result check = aaaaaaa
10:39:59: result check = aaaaaaaa
10:39:59: result check = aaaaaaaaa
10:39:59: result check =
10:39:59: result check =
10:39:59: result check =
在 for 循环期间未释放函数结果堆栈? :O
【问题讨论】:
这在 SO 之前已经处理过了。 【参考方案1】:Result
被视为函数的隐式 var
参数。
想象一下,如果你这样明确地写出来:
procedure test(var result: string);
begin
result := result + 'a';
end;
for i := 1 to 10 do
test(s);
那么你会期望它附加到s
。
您每次调用它时都会丢弃Result
,这就是编译器有时决定最终确定它的原因。正如@gabr 指出的那样,作为优化,它选择在循环内不最终确定这个隐式变量。
如果您每次调用test
时都将test
的结果分配给一个字符串,那么您会看到字符串每次都变长,它永远不会被重新初始化。
这就是为什么你应该总是初始化你的结果变量。它看起来像一个局部变量,但最好将其视为var
参数。
【讨论】:
+1 为示例,但请将您对我现在已删除的答案所做的评论包含在您的答案中 (if you assign the result to something outside of the function, then the initialization will happen once and once only
)
@Cosmin 那已经存在了,但我现在把它作为一个新段落(倒数第二个)突出显示
@DavidHeffernan,很好的答案!今天我在动态数组中遇到了类似的问题,很容易解决,但这帮助我真正理解了。【参考方案2】:
嗯,你应该总是初始化函数结果。不要仅仅因为它是动态(在本例中为字符串)类型就认为它会被设置为适当的值。
【讨论】:
然后编译器应该发出“未初始化”警告,就像非生命周期管理的类型一样。以上是关于Delphi:for循环期间函数结果未清空的主要内容,如果未能解决你的问题,请参考以下文章