当我阅读原始delphi源代码中的修改(主要是在firemonkey中)时,我看到embarcadero有时会将if assigned(MyObj) then
替换为if (MyObj <> nil) then
。他们有任何真正的理由这样做,或者它只是纯粹的化妆品吗?
答案 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
,因为这样可以保证代码的一致性。此外,这意味着您甚至不必考虑测试的主题是单指针类型还是双指针类型,或者您的代码是否在设计器中运行。