型および型メンバの注釈付け
属性(RTTI) への移動
このトピックでは、型やメンバに属性で注釈を付ける場合に適用される構文とルールについて説明します。
一般的な構文
Delphi の型や型メンバ(クラスやクラス メンバなど)に注釈を付けるには、その型の宣言の前に、属性クラスの名前を角かっこで囲んで付け加える必要があります。次に例を示します。
[CustomAttribute]
TMyClass = class;
属性クラスの名前が "Attribute" で終わる場合は、次のように、その "Attribute" を省略することもできます。
[Custom]
procedure DoSomething;
次のように、属性クラス名の後に一組の丸かっこを付けるのも有効な構文です。
[Custom()]
TMyRecord = record;
属性の中には、パラメータを受け取るものがあります。属性に引数を渡すには、次のように、メソッド呼び出しの場合と同じ構文を使用します。
[Custom(Argument1, Argument2, …)]
TSimpleType = set of (stOne, stTwo, stThree);
単一の型に複数の属性で注釈を付けるには、次のように、それぞれの属性を別個に角かっこで囲むか、
[Custom1]
[Custom2(MyArgument)]
FString: String;
次のように、属性をコンマで区切ったリストを一組の角かっこで囲みます。
[Custom1, Custom2(MyArgument)]
function IsReady: Boolean;
属性パラメータには定数式のみ使用可能
型やメンバに注釈として付加される属性は、生成されるバイナリの RTTI 情報ブロックに挿入されます。出力される情報には、次のものがあります。
- 属性のクラス型
- 選択されたコンストラクタのポインタ
- 後で属性のコンストラクタに渡される定数のリスト
属性のコンストラクタに渡される値は定数式でなければなりません。これらの値は生成されるバイナリに直接埋め込まれる必要があるので、実行時評価が必要な式を渡すことは不可能です。そのため、コンパイル時に属性に渡すことができる情報には、次のようないくつかの制限が生じます。
- 集合、文字列、順序型の式などの定数式のみ使用可能です。
- TypeInfo() を使用して型情報を渡すことができます(RTTI ブロックのアドレスはコンパイル時にわかっているため)。
- クラス参照を使用できます(メタクラスのアドレスはコンパイル時にわかっているため)。
- out パラメータや var パラメータは使用できません(渡されたパラメータのアドレスの実行時評価が必要になるため)。
- Addr() や @ 演算子は使用できません。
次のコードは、注釈がコンパイルされない場合の例です。
var
a, b: Integer;
type
[SomeAttribute(a + b)]
TSomeType = record
// …
end;
上記の例で、SomeAttribute
のコンストラクタには整数値が必要です。渡される式には、a + b
の実行時評価が必要になります。コンパイラでは定数式が渡されることを想定しているため、コンパイル エラーが発生します。
次のコードでは、式を渡すことができる場合の例を示します。
const
a = 10;
b = 20;
type
[SomeAttribute(a + b)]
TSomeType = record
// …
end;
a
と b
の値はコンパイル時にわかっているため、この定数式は直接評価されます。