【问题标题】:What is the default value of 'Result' in Delphi?Delphi中'Result'的默认值是什么?
【发布时间】:2011-07-17 06:00:09
【问题描述】:

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

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

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

它工作得很好,但现在我得到了一些包含先前调用该函数的内容的字符串。当我在开头添加Result := '' 时,就可以了。我应该什么时候初始化Result 变量,什么时候不需要? (字符串、原语、类实例(nil))

【问题讨论】:

标签: delphi


【解决方案1】:

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

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

昨天刚刚在 Stack Overflow 上讨论了这个问题:

Do I need to setLength a dynamic array on initialization?

【讨论】:

【解决方案2】:

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

Delphi Reference > Procedures and Functions > Function Declarations

【讨论】:

    【解决方案3】:

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

    不过,至于这个特定的问题; Result 不应该在范围内是函数本地的吗?如果这样一个变量,即使是特殊的,保留以前调用函数的值,我会感到非常惊讶。

    【讨论】:

    • 是的,看起来我应该是!添加到列表中的另一个原因是我喜欢在使用变量之前始终对其进行初始化。
    • 总是初始化变量——这通常是一种很好的风格。但是有些语言提供隐式初始化,因此您可能会编写效率低下的代码,例如(大多数)C++ 类及其构造函数,您可以在其中得到良好支持的按值选项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    相关资源
    最近更新 更多