if assigned(MyObj) then 还是 if (MyObj <> nil) then 更好

Is it better to do if assigned(MyObj) then or if (MyObj <> nil) then

当我阅读原始 delphi 源代码中所做的修改时(主要在 firemonkey 中),我看到 embarcadero 有时会用 if (MyObj <> nil) then 替换 if assigned(MyObj) then。他们这样做有什么真正的理由,还是纯粹是为了装饰?

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

方法指针是有区别的。 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,因为这样可以使代码保持一致。此外,这意味着您甚至不必考虑测试对象是单指针类型还是双指针类型,或者您的代码是否曾在设计器中运行过。