在 Delphi 中,从 TObject 继承的变量的记录行为是默认值 nil。然而,我遇到过一种情况,情况并非如此。
通过 IDE (F9) 运行以下代码示例会产生混合结果
var
objTemp : TMemDataSet;
begin
if (objTemp = nil) then
ShowMessage('Nil');
end;
- 32 位/调试模式,不默认为零
- 32位/释放模式,不默认为nil
- 64 位/调试模式,is默认为零
- 64位/Release模式,不默认为nil
我的理解是该值应始终默认为零。
在XE2和XE5下也进行了测试,结果相同。
这是 Delphi 中的预期行为吗?
你的理解是不正确的。非托管类型(IOW,非引用计数类型)的局部变量未初始化。您必须先为它们分配一个值,然后才能使用它们。
来自XE5文档 http://docwiki.embarcadero.com/RADStudio/XE5/en/Variables(参见“声明变量”部分的底部 - 我在 Wiin32 中包含了类型拼写错误,但重点是我的):
如果你没有显式初始化全局变量,编译器
将其初始化为 0。对象实例数据(字段)也是
初始化为0。在 Win32 平台上,本地的内容
变量在被赋值之前是未定义的。
请注意,每当 Emba 写入“Win32”时,它们都表示非 ARC 编译器,因此上述内容也适用于 Win64 和 OSX。
您可以通过在帮助索引中使用搜索词“变量”在 Delphi 2007 中找到相同的信息;它是“变量 VBScript”和“变量 [OpenGL]”之间的一个。
您在 Win64 调试版本中看到的差异可能只是编译器完成的操作、幸运的意外或完全是其他原因。不过,这应该不重要。正如您所知,局部变量默认情况下不会初始化,只需确保在使用它们之前在所有情况下都这样做即可。这并不是一条很难执行的规则;当你声明一个局部变量时,
var
MyObj: TSomething;
您要么自己分配一个值,要么从代码中的其他地方收到一些值:
MyObj := TSomething.Create; // Created yourself
MyObj := GetSomething(); // Function result
MyObj := Self.SomethingCollection[Self.SomethingCount - 1]; // Local ref
绝对没有理由需要依赖于是否初始化局部变量,因为可以在分配给局部变量之前对外部引用进行测试,也可以在分配外部引用之后对局部变量进行测试:
if SomethingIGot = nil then
raise Exception.Create('Received a nil parameter');
MyObj := SomethingIGot;
// or
MyObj := SomethingIGot;
if not Assigned(MyObj) then
raise Exception.Create('MyObj was assigned a nil value');
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)