【发布时间】:2017-06-12 03:05:20
【问题描述】:
我有记录类型:
type
TIPInfo = record
IP,
HostName,
City,
Region,
Country,
Loc,
Org: WideString
end;
返回记录数据的函数:
function GetPublicIPInfo(var IPInfo: TIPInfo): Boolean;
begin
// initialize
FillChar(IPInfo, SizeOf(TIPInfo), 0);
// populate data
IPInfo.IP := GetVallue('ip');
IPInfo.HostName := GetVallue('hostname');
IPInfo.City := GetVallue('city');
// etc...
Result := IsOk;
end;
调用者:
var
IPInfo: TIPInfo;
if GetPublicIPInfo(IPInfo) then... // use data
通过调用FillChar 来初始化var TIPInfo 是正确的方法还是应该将每个字段都设置为空字符串?调用者应该这样做吗?
另外,在这种情况下使用out参数会更好吗(因为函数没有读取数据)?
【问题讨论】:
-
当函数不读取参数时,我会使用 out 参数。此外,在这种情况下,很明显函数本身应该初始化它而不是调用者。 FillChar 不会在每种情况下正确初始化像字符串这样的托管类型(尽管在您的情况下确实如此),所以我只会分别初始化每个字段。
-
在这种情况下,所有记录字段都是
WideString,由编译器自动初始化,所以函数根本不需要初始化任何东西。话虽如此,我同意 R.Beiber 的观点,使用out而不是var是最好的选择。 -
@RemyLebeau 成员可以具有来自该对象的某些先前使用的任意值。所以他们确实需要被分配。
-
@R.Beiboer,“虽然在你的情况下确实如此”是什么意思?
-
@zig 当所有 WideStrings 都是空字符串时,FillChar 不会造成伤害。如果分配了其中任何一个,FillChar 不会处理字符串。我假设在您的情况下它们是空的,这就是为什么我说“尽管在您的情况下确实如此”。此外,我认为您应该接受 David 的回答,因为他清楚地解释了初始化记录的工作原理以及 out 和 var 的用法。