今天我决定使用TParallel.For,并成功在Delphi 10.2.3中使用
但是TParallel.For有一个奇怪的定义,这种定义对我来说是新的。另外,我在Delphi文档中找不到它的含义。
class function TParallel.&For(ALowInclusive, AHighInclusive: Integer; const AIteratorEvent: TProc<Integer>): TLoopResult;
&运算符在这里是什么意思? 因为这两个编译都使用TParallel。&For或TParallel.For,所以有什么区别。
答案 0 :(得分:9)
“&”号用于“转义”保留字。考虑以下示例:
function GetPart: string;
const
LoremIpsum = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do ' +
'eiusmod tempor incididunt ut labore et dolore magna aliqua.';
var
start, end: integer;
begin
start := 2;
end := 10;
result := Copy(LoremIpsum, start, end - start + 1);
end;
很显然,它不会编译,因为end
是保留字,因此不能用作标识符。
但是,如果您仍然真的想使用end
作为变量的名称,则可以在变量前加上&
:
function GetPart: string;
const
LoremIpsum = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do ' +
'eiusmod tempor incididunt ut labore et dolore magna aliqua.';
var
start, &end: integer;
begin
start := 2;
&end := 10;
result := Copy(LoremIpsum, start, &end - start + 1);
end;
这告诉编译器,“嘿,不要将下一个标记视为保留字。”
当然,有人可能会争辩说,在大多数情况下,最好使用非保留字作为标识符,而不是使用&
技巧来逃避令牌。但是,有时您需要标识符具有其他框架和技术所规定的名称,因此Delphi需要支持一种允许使用保留字作为标识符的方法。
(但是,就我个人而言,即使没有“外部约束”,我发现最自然的选择是碰巧是保留字,但我还是倾向于在自己的代码中使用&
技巧。需要该名称。)
答案 1 :(得分:8)
这在documentation中有描述:
扩展标识符
您可能会遇到与Delphi语言保留字同名的标识符(例如类型或类中的方法)。例如,一个类可能有一个称为begin的方法。 Delphi保留字(例如begin)不能用作标识符名称。
如果完全限定标识符,则没有问题。例如,如果要使用Delphi保留字类型作为标识符名称,则必须使用其完全限定名称:
var TMyType.type // Using a fully qualified name avoids ambiguity with {{Delphi}} language keyword.
作为更简短的替代方案,可使用&运算符来解决标识符与Delphi语言保留字之间的歧义。 &阻止将关键字解析为关键字(即保留字)。如果遇到与Delphi关键字同名的方法或类型,则在标识符名称前加上“&”符号可以忽略名称空间规范。但是,当您声明与关键字同名的标识符时,必须使用&:
type &Type = Integer; // Prefix with '&' is ok.
本文说明了为什么在调用方法时不需要&
。你可以写
TParallel.For(...);
并且编译器能够解决歧义,因为您的标识符已经合格。