清空数组时,以下替代方案之间是否有任何需要注意的区别?
假设arr是一个TArray<string>:
SetLength(arr, 0);
Run Code Online (Sandbox Code Playgroud)
或者
arr := [];
Run Code Online (Sandbox Code Playgroud)
我猜它们是相同的,但我的 Delphi 有点生疏了,我似乎记得在几个月前看似有效的代码之后,微妙的“特性”又回来困扰着我......
如果arr是动态数组变量,则
SetLength(arr, 0)
Run Code Online (Sandbox Code Playgroud)
和
arr := nil
Run Code Online (Sandbox Code Playgroud)
和新的(德尔福 XE7+)
arr := []
Run Code Online (Sandbox Code Playgroud)
都是等价的。
理解这种等价性的关键是SetLength文档中的以下部分:
调用 , 后
SetLength保证S引用唯一的字符串或数组——即引用计数为 1 的字符串或数组。
另外,请记住,空动态数组由指针表示nil,而不是指向“长度为零的动态数组堆对象”的指针:
当变量为空(未初始化)或包含零长度数组时,指针为空,
nil并且没有与该变量关联的动态内存。