我读过一些关于 Delphi absolute
关键字的文章,例如 Delphi 中的绝对关键字
您能为我提供一个有关如何使用该功能的真实示例吗?
使用
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
我经常在这个结构中使用它:
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;
它们
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 可能都更好。