我正在追踪一些字符编码代码,发现System.SysUtils
function TEncoding.GetBytes(const S: string): TBytes;
var
Len: Integer;
begin
Len := GetByteCount(S);
SetLength(Result, Len);
GetBytes(S, Low(S), Length(S), Result, 0, Low(S));
end;
这里做什么Low(S)
?
GetBytes()
这里调用的重载是:
function TEncoding.GetBytes(const S: string; CharIndex, CharCount: Integer;
const Bytes: TBytes; ByteIndex: Integer; const StringBaseIndex: Integer): Integer;
这有一个有点神秘的评论:
// StringBaseIndex : Low(string) on caller's context
内置函数
Low()
返回可索引项的下标。对于String
,在最新版本中此值始终为 1,但在之前的几个版本中,此值在移动平台上为 0,因此使用Low()
可让您编写可在所有平台上编译的代码,无论目标是什么。为清楚起见,在迭代可索引项的有效索引时,您应该始终使用
Low()
(andHigh()
),即使您可能知道(或认为您知道)Low
and/orHigh
值是什么。让编译器为您确定它会更安全。我曾见过类似这样的结构:
而我的问题一直是,为什么他们使用
High()
然后又省略Low()
——这对我来说毫无意义。所以 - 我的建议是始终这样做:
Low(String)
无论您知道什么(或认为您知道什么 - 以及最近从 0 到 1的变化)。并且,当迭代 a 中的所有字符时
String
,可以使用:或者:
High(Str)
Length(Str)
与现代编译器中的相同,但是当Low(Str)
为 0 时,则High(Str)
等于Length(Str)-1
。使用
Low()
和High()
也清楚地说明了您的意图,即您正在迭代该项目的所有有效索引。