是否有任何方法可以通过使用代码来计算数组中有多少个元素?
例如:
arrName : array[1..20] of string;
我已经知道该数组中存储了6个名称,但是如何使用编码来确定呢?
是的,但前提是该数组包含托管类型。
看一下下面的代码示例。
procedure TForm1.Button1Click(Sender: TObject);
var
sa: array[0..19] of string;
i: Integer;
begin
for i := 0 to 5 do
sa[i]:= 'test'+IntToStr(i);
for i := 6 to High(sa) do begin
if sa[i] <> '' then ShowMessage('oops'); //will never be triggered.
end;
end;
请注意,空字符串又''
是有效字符串。如果允许程序在此数组中存储空字符串,则方案将失败;否则,方案将失败。如果是这样,则需要使用占位符字符串初始化数组。
托管类型初始化为空
在调试此示例并打开CPU窗口时,您将看到以下初始化代码:
Unit1.pas.30: begin
005C9B24 55 push ebp
005C9B25 8BEC mov ebp,esp
......
005C9B3F E8F811E4FF call @InitializeArray
......
Unit1.pas.31: for i := 0 to 5 do
在该begin
语句中进行调用,InitializeArray
因为该数组包含string
。
如果数组包含:string
,interface
,dynamic array
,variant
或anonymous method
(或含任何这些记录),那么它会被初始化。
非托管类型不会初始化
如果数组包含其他内容,它将不会初始化;表示它将包含该段内存中的所有内容。
procedure TForm1.Button1Click(Sender: TObject);
var
sa: array[0..19] of integer;
i: Integer;
begin
for i := 0 to 5 do
sa[i]:= i+1;
for i := 6 to High(sa) do begin
//will most likely be triggered
if sa[i] <> 0 then ShowMessage('no init for integer');
end;
end;
(显然,**dynamic** array
(没有预设界限的数组)在使用前和扩展时将被清零)
这不适用于类成员
当创建对象(该类的实例)时,该类的所有成员(aka字段)都初始化为零。
全局变量也初始化为零。方法本地变量不是。
聪明的编程
如果您因某种原因被迫使用固定长度的数组来存储可变数量的字符串,那么遍历该数组来计算项目数是很浪费的。
最好有一个计数器来跟踪元素的数量。
type
TNames = record
count: integer;
items: array[0..20] of string;
end;
否则,您将陷入画家的陷阱Schlemiel中。一种众所周知的反模式。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句