Delphi“绝对”关键字

问题描述 投票:0回答:3

我读过一些关于 Delphi absolute 关键字的文章,例如 Delphi 中的绝对关键字

,但我希望更好地了解如何使用它。

您能为我提供一个有关如何使用该功能的真实示例吗?

delphi
3个回答
4
投票

使用

absolute
时,您可以在已存在变量的同一内存地址处添加另一个变量。 我之前的答案的优化摘录:

var
  Number: Integer;
  Text: String;
  Flag: Boolean;

  SameNumber: Integer  absolute Number;
  OtherText: String    absolute Text;
  Switch: Boolean      absolute Flag;
begin
  // Pascal's keyword "absolute" makes the variable merely an alias of
  // another variable, so anything you do with one of both also happens
  // with the other side.
  Number:= 1138;            // Same as   SameNumber:= 1138;
  OtherText:= 'Content';    // Same as   Text:= 'Content';
  Flag:= TRUE;              // Same as   Switch:= TRUE;

它也是在具有级联函数时访问函数的

result
变量的一种方法:

function FirstLevel: Boolean;
var
  FirstResult: Boolean absolute result;

  function SecondLevel: Boolean;
  begin
    result:= TRUE;  // This function
    FirstResult:= FALSE;  // The outer function
  end;

begin
  SecondLevel();
  // Now this function's result has been set already
end;

它还可以用于在类型之间进行广泛的转换 - 它甚至不必有意义。但应该:

var
  Letter: WideChar;  // 16 bit long
  CodePoint: Word absolute Letter;  // also 16 bit long
begin
  CodePoint:= $30c4;  // Katakana "Tu"
  // Letter automatically becomes 'ツ'

  Letter:= 'И';  // Cyrillic "I"
  // Codepoint automatically becomes $0418

3
投票

我经常在这个结构中使用它:

PROCEDURE LabelClick(Sender : TObject);
  VAR
    LBL : TLabel ABSOLUTE Sender;

  BEGIN
    .
    . // Use LBL.Caption etc. instead of casting Sender on every use
    . // or use an explicit assignment
    .
  END;

2
投票

它们

absolute
关键字告诉编译器在与另一个变量相同的地址创建一个变量。

在下面的示例中,我们声明了一个 String[32](短字符串)类型的变量

Str
。内存中的该变量由一个字节表示,该字节的值是字符串的长度,然后是一个字节数组,该字节数组是组成字符串的字符的ascii代码。
StrLen
类型的变量
Byte
定义在与变量
Str
相同的地址处,产生的效果是
StrLen
的值是
Str
字符串的长度。

procedure TForm1.Button1Click(Sender: TObject);
var
    Str    : String[32];
    StrLen : Byte absolute Str;
begin
    Str := 'ABC';
    Memo1.Lines.Add(IntToStr(StrLen));  // Will display "3"
end;

absolute
关键字有点过时了。大多数时候使用它是一个坏主意。在几乎所有情况下,使用 cast 可能都更好。

© www.soinside.com 2019 - 2024. All rights reserved.