当我阅读原始 delphi 源代码(主要是在 firemonkey 中(所做的修改时,我看到 embarcadero 有时会用if (MyObj <> nil) then
替换if assigned(MyObj) then
。他们这样做的真正原因是什么,或者它只是纯粹的化妆品?
对于指针、对象引用、动态数组、接口,没有区别。你可以做任何一个。
对于方法指针,这是有区别的。IDE 窗体设计器对已发布的方法指针属性(例如事件(执行一些技巧。nil
这些指针时,IDE 窗体设计器会将索引存储在其中一个指针的低两个字节中。如果你要针对nil
进行测试,你会发现该值没有nil
,这是不需要的。
所以你使用Assigned
忽略低两个字节。这在 Windows 上是可能的,因为低于 65536 的内存地址是保留的,不能是有效的指针。这对于在 IDE 表单设计器中运行的代码(即设计时包(至关重要。在这些情况下,组件编写器必须使用Assigned
。
请注意,这仅适用于 Win32 编译器。由于这是运行 IDE 的唯一平台,因此它是Assigned
具有此特殊行为的唯一平台。
艾伦鲍尔在这里讨论这个问题:分配还是不分配,这是个问题......
还有一点要说明:
- 使用
Assigned
永远不会错。 - 当主题是支持已发布属性的方法指针并且代码在设计时运行时,与
nil
进行比较是错误的。
就个人而言,我总是使用Assigned
,因为这可以使代码保持一致。此外,这意味着您甚至不必考虑测试的主题是单指针类型还是双指针类型,或者您的代码是否在设计器中运行。