Arrays 如何检查动态数组是否为空

Arrays 如何检查动态数组是否为空,arrays,delphi,Arrays,Delphi,我有一个这样宣布的程序: procedure MyProc(List: Array of string); 我想知道如何检查列表参数是否为空 例如: procedure MyProc(List: Array of string); begin if List=[] then // here I want to check if the List array is empty //do something else //do something else end; 我如何才能

我有一个这样宣布的程序:

procedure MyProc(List: Array of string);
我想知道如何检查
列表
参数是否为空

例如:

procedure MyProc(List: Array of string);
begin
  if List=[] then // here I want to check if the List array is empty
  //do something
  else 
  //do something else
end;
我如何才能做到这一点?

您可以使用该功能


空数组等于
nil

if List = nil then // it's empty
(这也意味着
SetLength(List,0)
List:=nil
是等效的命令。)

空数组的最后一个索引小于第一个索引,这对于示例中的开放数组意味着最后一个索引为负:

if High(List) < 0 then // it's empty

就我个人而言,我总是写作

if Assigned(List) then
而不是

if List<>nil then
如果Listnil则
因为我相信它读起来更好,不仅仅是动态数组


这回答了动态数组的问题,但是您的示例是一个开放数组,因此这里有两个可能的问题


对于开放数组,我将使用
Length()
high()
根据数组的大小做出决定。我不会被
指针(列表)nil
长度(列表)nil
快的论点所诱惑。这些选项之间的速度差异不明显,因此您应该使用最清晰易读的选项。

如果List=nil,那么是否确定
?这一行不编译。
如果指针(List)=nil,那么
是检查动态数组是否为空的最快方法(比
长度(List)=0
最快)@RRUZ:这是因为
List=nil
仅适用于
动态数组
(如本问题标题中所示),而不适用于
开放数组
(就像这个问题的例子)海报混合了动态数组和开放数组。我不喜欢使用
Assigned(List)的想法
或该主题上的任何其他变体,以检查数组是否为空。例如,比较
TList
类。在
MyTList=nil
MyTList.Count=0
之间有着显著不同的含义。正如不存在的东西不能有任何项一样,它不存在的事实也可能是一个重要因素我不能出错。所以我宁愿坚持使用
Length(List)
,更好的是
,因为I:=Low(List)到High(List)
,其优点是这三种数组都是一样的。(+1表示:“如果List为空,则不会运行”)您应该编写
MyProc(const List:array of string)
因为在您的代码中,在调用
MyProc
过程之前,所有字符串都会复制到临时数组中。如果指针(列表)=nil,则
是检查动态数组是否为空的最快方法。
指针(列表)
放弃类型安全性,依靠实施detail@ArnaudBouchez在没有常量说明符的情况下,只有在MyProc中修改数组时,才将其复制到新的(临时)数组,而不是在调用之前(动态数组像字符串一样遵循COW策略)@Bozzy I确实不准确:所有字符串都不会复制到临时数组中。但是字符串的refcount会先增加,然后减少,因此有两个不必要的RTL调用。因此,如果使用
const
就不会有那些AddRef/DecRef隐藏过程调用。我同意。这比其他方法更像Delphi。+1我不喜欢使用
分配的想法(列表)
或该主题上的任何其他变体,以检查数组是否为空。例如,比较
TList
类。在
MyTList=nil
MyTList.Count=0
之间有着显著不同的含义。正如不存在的东西不能有任何项一样,它不存在的事实也可能是一个重要因素我不能出错。所以我宁愿坚持使用
Length(List)
,更好的是
,因为I:=Low(List)to High(List)
,其优点是这三种数组都是一样的。@Craig在实践中,我认为动态数组和对象不容易混淆,但我同意你的观点。
if Assigned(List) then
if List<>nil then