代码之家  ›  专栏  ›  技术社区  ›  zeus

如果被分配(myobj),那么最好还是(myobj<>nil),然后[复制]

  •  0
  • zeus  · 技术社区  · 6 年前

    这个问题已经有了答案:

    当我阅读原始Delphi源代码(大部分在FireMonkey中)所做的修改时,我看到Embarcadero有时会替换 if assigned(MyObj) then 通过 if (MyObj <> nil) then . 他们这样做的真正原因是什么,还是仅仅是纯粹的化妆品?

    1 回复  |  直到 6 年前
        1
  •  13
  •   Kromster    6 年前

    对于指针、对象引用、动态数组、接口,没有区别。你也可以这样做。

    对于方法指针有区别。IDE窗体设计器使用已发布的方法指针属性(例如事件)进行一些欺骗。当这些是 nil IDE窗体设计器将索引存储在其中一个指针的两个低位字节中。如果你要测试这个 你会发现这个值不是 ,这是不需要的。

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

    请注意,这只适用于Win32编译器。因为这是唯一一个运行IDE的平台,所以这是唯一一个 分配 有这种特殊的行为。

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

    还有一点需要说明:

    • 使用永远不会错 分配 .
    • 与…相比是错误的 当主题是支持已发布属性的方法指针,并且代码在设计时运行时。

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