Delphi中“结果”的默认值是多少?

时间:2011-03-17 08:57:54

标签: delphi

函数的 Result 变量是否有任何保证的默认值,如0,''或nil?或者结果是否应在使用前初始化?

我有一个函数返回一个这样的字符串:

function Foo(): String
begin
    while {...} do
    Result := Result + 'boingbumtschak';
end;

它工作正常,但现在我得到一些字符串,其中包含之前调用该函数的内容。当我在开头添加Result := ''时,就可以了。我什么时候应该初始化Result变量,什么时候不需要? (字符串,基元,类实例(无))

3 个答案:

答案 0 :(得分:19)

类型string的函数返回值实际上被编译器视为隐式var参数。当函数开始执行时,Result变量包含随后将为其分配返回值的局部变量中的任何内容。

因此,您应该始终初始化函数返回值。该建议不仅适用于字符串,还适用于所有数据类型。

此问题仅在昨天Stack Overflow上进行了讨论。

答案 1 :(得分:6)

  

如果函数退出而没有   为Result或者分配值   函数名,然后是函数的   返回值未定义

请参阅Delphi Reference> Procedures and Functions> Function Declarations

答案 2 :(得分:2)

我不知道在Delphi中它是什么样的,但我总是在我对它们执行操作之前将变量初始化为一个合理的值(即使这个合理的值是{ {1}},在某些情况下可能很好)。很多时候它不需要,但在那些情况下,我依靠编译器或JITter来优化分配,如果它想要,而不是依赖于潜在的未记录的语言语义或编译器实现细节。也许它是我在C中的背景,它本身基本上不保证初始值,但是为了获得更清晰的代码,花费额外的一行代码(最多)是值得的。通过在开始处理变量之前显式赋值,可以与任何正在阅读代码的人建立明确的契约;他们可以相信他们对变量起始值的看法实际上是成立的。

至于这个特殊问题; isn&#t; t null应该是范围内的函数本地?如果这样的变量(即使是特殊的)保留了函数之前调用的值,我会感到非常惊讶。