加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 为什么不将对象默认为nil?

发布时间:2020-12-15 04:21:28 所属栏目:大数据 来源:网络整理
导读:在Delphi中,从TObject下降的变量的记录行为是默认值nil.但是,我遇到的情况并非如此. 通过IDE(F9)运行以下代码示例会得到混合结果 var objTemp : TMemDataSet;begin if (objTemp = nil) then ShowMessage('Nil');end; 32位/调试模式,默认为零 32位/释放模式,
在Delphi中,从TObject下降的变量的记录行为是默认值nil.但是,我遇到的情况并非如此.

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

var
  objTemp : TMemDataSet;
begin
  if (objTemp = nil) then
     ShowMessage('Nil');
end;

> 32位/调试模式,默认为零
> 32位/释放模式,默认为零
> 64位/调试模式,默认为零
> 64位/释放模式,默认为零

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

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

这是Delphi中的预期行为吗?

解决方法

你的理解是不正确的.未初始化非托管类型(IOW,非引用计数类型)的局部变量.您必须先为它们分配值才能使用它们.

从XE5 documentation开始(参见“声明变量”部分的底部 – 我在Wiin32中包含了类型拼写错误,但重点是我的):

If you don’t explicitly initialize a global variable,the compiler
initializes it to 0. Object instance data (fields) are also
initialized to 0. On the Win32 platform,the contents of a local
variable 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.

您可以在帮助索引中使用搜索词Variables在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

绝对没有理由需要依赖于初始化的局部变量,因为测试可以在分配给本地var之前在外部引用上完成,或者在分配外部引用之后在本地var上完成:

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');

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读