函数的 Result 变量是否有任何保证的默认值,如0,''或nil?或者结果是否应在使用前初始化?
我有一个函数返回一个这样的字符串:
function Foo(): String
begin
while {...} do
Result := Result + 'boingbumtschak';
end;
它工作正常,但现在我得到一些字符串,其中包含之前调用该函数的内容。当我在开头添加Result := ''
时,就可以了。我什么时候应该初始化Result
变量,什么时候不需要? (字符串,基元,类实例(无))
答案 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
应该是范围内的函数本地?如果这样的变量(即使是特殊的)保留了函数之前调用的值,我会感到非常惊讶。