在Delphi中,“&”运算符是什么意思?

时间:2018-08-07 12:37:31

标签: delphi

今天我决定使用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,所以有什么区别。

2 个答案:

答案 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(...);

并且编译器能够解决歧义,因为您的标识符已经合格。