是的,常量可以与任何计算结果为数组的适当且有效索引的表达式一起使用。您还应该注意,Delphi 中的数组可以使用基于非零的索引范围声明:
var
MonthlyTotals: array[1..12] of Integer; // Jan = 1, Feb = 2 etc etc
您甚至可以将数组的索引指定为枚举类型,并使用枚举成员作为索引,从而提供更严格的安全性(在可能和适当的情况下),根据这个人为的示例:
type
TFileFormat = (ffXML, ffCSV, ffText, ffJSON);
var
sExtensions: array[TFileFormat] of String;
sExtensions[ffXML] := 'xml';
sExtensions[ffCSV] := 'csv';
sExtensions[ffText] := 'txt';
sExtensions[ffJSON] := 'json';
在这种情况下,数组可能只有枚举中某些(连续)值的成员:
var
sExtensions: array[ffXML..ffCSV] of String;
出于这个原因,以及数组索引可能不是从零开始的事实,除非您 110% 确定数组的索引范围,否则最好始终使用Low()和High()来确定索引范围迭代数组的内容而不假设索引基础:
// This will not work properly:
for i := 0 to 11 do
MonthlyTotals[i] := ....
// Neither will this, even though it looks more safe
for i := 0 to Pred(Length(MonthlyTotals)) do
MonthlyTotals[i] := ....
// This will be safe:
for i := Low(MonthlyTotals) to High(MonthlyTotals) do
MonthlyTotals[i] := ....
// And it works for enum indices as well:
for ext := Low(sExtensions) to High(sExtensions) do
sExtensions[ext] := ....