如果分配了(MyObj)那么或者如果(MyObj<> nil)则更好

时间:2018-05-22 07:42:28

标签: delphi firemonkey

当我阅读原始delphi源代码中的修改(主要是在firemonkey中)时,我看到embarcadero有时会将if assigned(MyObj) then替换为if (MyObj <> nil) then。他们有任何真正的理由这样做,或者它只是纯粹的化妆品吗?

1 个答案:

答案 0 :(得分:13)

对于指针,对象引用,动态数组,接口,没有区别。你可以做任何一件事。

对于方法指针,存在差异。 IDE表单设计器使用已发布的方法指针属性做了一些技巧,例如:事件。当这些是nil时,IDE表单设计器将索引存储在其中一个指针的低两个字节中。如果您要针对nil对此进行测试,您会发现该值不是nil,这是不合适的。

所以你使用忽略低两个字节的Assigned。这在Windows上是可行的,因为低于65536的内存地址是保留的,并且不能是有效的指针。这对于在IDE表单设计器中运行的代码(即设计时包)至关重要。在这些情况下,组件编写者必须使用Assigned

请注意,这仅适用于Win32编译器。由于这是IDE运行的唯一平台,因此Assigned具有此特殊行为的唯一平台。

Allen Bauer在此讨论:Assigned or not Assigned, that is the question...

还有一点要做:

  • 使用Assigned
  • 绝对没错
  • 当主题是支持已发布属性的方法指针,并且您的代码在设计时运行时,与nil进行比较是错误的。

就个人而言,我总是使用Assigned,因为这样可以保证代码的一致性。此外,这意味着您甚至不必考虑测试的主题是单指针类型还是双指针类型,或者您的代码是否在设计器中运行。