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