gpt4 book ai didi

delphi - 为什么 object 不默认为零?

转载 作者:行者123 更新时间:2023-12-03 14:57:03 26 4
gpt4 key购买 nike

在 Delphi 中,从 TObject 派生的变量的记录行为是默认值 nil。但是,我遇到过一种情况,情况并非如此。

通过 IDE (F9) 运行以下代码示例会产生混合结果

var
objTemp : TMemDataSet;
begin
if (objTemp = nil) then
ShowMessage('Nil');
end;
  • 32 位/ Debug模式,不默认为 nil
  • 32位/ Release模式,不默认为nil
  • 64 位/ Debug模式,默认为 nil
  • 64位/ Release模式,不默认为nil

我的理解是该值应始终默认为零。

还在 XE2 和 XE5 下进行了测试,结果相同。

这是 Delphi 中的预期行为吗?

最佳答案

你的理解是错误的。非托管类型(IOW,非引用计数类型)的局部变量未初始化。您必须先为它们分配一个值,然后才能使用它们。

来自XE5 documentation (请参阅“声明变量”部分的底部 - 我在 Wiin32 中包含了类型拼写错误,但重点是我的):

If you don't explicitly initialize a global variable, the compilerinitializes it to 0. Object instance data (fields) are alsoinitialized to 0. On the Win32 platform, the contents of a localvariable are undefined until a value is assigned to them.

Note that whenever Emba writes "Win32" they mean non-ARC compiler, so the above is also valid for Win64 and 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');

关于delphi - 为什么 object 不默认为零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23116055/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com