"&"运算符在Delphi中意味着什么?

Meh*_*ide 5 delphi

今天我决定使用TParallel.For并成功用于Delphi 10.2.3

但TParallel.For有一个奇怪的定义,这种定义对我来说是新的.我也无法在Delphi文档中找到它的含义.

class function TParallel.&For(ALowInclusive, AHighInclusive: Integer; const AIteratorEvent: TProc<Integer>): TLoopResult;
Run Code Online (Sandbox Code Playgroud)

& Operator在这里是什么意思?使用TParallel.&For或TParallel.For之间有什么区别,因为两者都编译.

And*_*and 10

&符号用于"逃避"保留字.请考虑以下示例:

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;
Run Code Online (Sandbox Code Playgroud)

显然,这不会编译,因为它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;
Run Code Online (Sandbox Code Playgroud)

这告诉编译器,"嘿,不要将下一个标记视为保留字".

当然,有人可能会争辩说,在大多数情况下,最好使用非保留字作为标识符,而不是使用&技巧来转义令牌.但是,有时您需要您的标识符具有由其他框架和技术决定的名称,因此Delphi需要支持允许使用保留字作为标识符的方法.

(就个人而言,我确实倾向于&在我自己的代码中使用这个技巧,当我找到的标识符最自然的选择恰好是一个保留字时,即使没有'外部约束'需要该名称.)


Dav*_*nan 8

这在文档中描述:

扩展标识符

您可能会遇到与Delphi语言保留字同名的标识符(例如,类中的类型或方法).例如,一个类可能有一个名为begin的方法.Delphi保留的单词如begin不能用于标识符名称.

如果您完全符合标识符,那么没有问题.例如,如果要将Delphi保留字类型用于标识名称,则必须使用其完全限定名称:

var TMyType.type
// Using a fully qualified name avoids ambiguity with {{Delphi}} language keyword.
Run Code Online (Sandbox Code Playgroud)

作为一个较短的替代方案,&符号(&)可用于解决标识符和Delphi语言保留字之间的歧义.&阻止关键字被解析为关键字(即保留字).如果遇到与Delphi关键字同名的方法或类型,则可以在标识符名称前加上&符号时省略命名空间规范.但是当您声明一个与关键字同名的标识符时,您必须使用&:

type
 &Type = Integer;
 // Prefix with '&' is ok.
Run Code Online (Sandbox Code Playgroud)

本文解释了&调用方法时不必要的原因.你可以写

TParallel.For(...);
Run Code Online (Sandbox Code Playgroud)

并且编译器能够解决歧义,因为您已经限定了标识符.