2014年9月3日

DelphiのRTLで定義済の属性

Delphi 2010で追加された新しいRTTIに含まれる属性機能ですが、Delphiのバージョンにより違いがあるものの、RTLで予め定義されている属性がいくつかあります。ところがこれらの定義済の属性についてヘルプにはきちんとした記述がありません。ということで調べてみました(XE6/XE7は手元にないので調べていませんが、既存のものについてはXE5と大きく異なる部分はないと思いますDelphi XE6/XE7/XE8/10 Seattle/10.1 Berlinについても確認しました)。

  • System ユニット
    TCustomAttribute
    [2010..12 Athens]カスタム属性のルートクラス
    属性を新たに定義するときはTCustomAttributeから派生させる
    WeakAttribute [Weak]
    [XE3..12 Athens]循環参照などのARCがオブジェクトの破棄を行えないような状況を防ぐ"弱い"参照であることを示す
    10 Seattleおよびそれ以前ではNEXTGENコンパイラのみ
    参考: コンパイラ属性 - RAD Studio
    参考: 弱い参照 (Delphi モバイル コンパイラでの自動参照カウント)
    UnsafeAttribute [Unsafe]
    [XE3..12 Athens]オブジェクトの生成時など参照カウントが0となるような状況でARCによる破棄を防ぐ
    10 Seattleおよびそれ以前ではNEXTGENコンパイラのみ
    参考: コンパイラ属性 - RAD Studio
    参考: Unsafe 属性 (Delphi モバイル コンパイラでの自動参照カウント)
    参考: モバイル開発のためのDelphi言語 (ホワイトペーパ)
    RefAttribute [Ref]
    [XE3..12 Athens]定数パラメータを強制的に参照渡しにする
    ヘルプによればRefAttributeはXE4の新機能だが、実際にはXE3でも使用可能
    参考: コンパイラ属性 - RAD Studio
    参考: 定数パラメータ (パラメータ(Delphi))
    VolatileAttribute [Volatile]
    [XE4..12 Athens]スレッドによって書き換えられる可能性があるフィールドに対して、コード生成時にレジスタまたはその他の一時メモリ領域に値をコピーするような最適化を行わないようにする
    10 Seattleおよびそれ以前ではNEXTGENコンパイラのみ
    参考: コンパイラ属性 - RAD Studio
    参考: Delphi コンパイラの新しい属性 (Delphi XE4 および C++Builder XE4 の新機能)
    参考: volatile (コンパイラ属性)
    StoredAttribute [Stored]
    [XE7..12 Athens]System.Classes.StoredAttributeを参照
    HPPGENAttribute [HPPGEN]
    [XE8..12 Athens]C++Builder用のhppファイル生成時に使用する情報らしいが詳細不明
    HFAAttribute [HFA]
    [XE8..12 Athens]pageId=86770118(なにそれ)に情報があるらしいが詳細不明(For internal use only.とコメントあり)ARM64プラットフォーム向けにレコード型/配列型に対して生成されたRTTI HFA情報をオーバライド
    AlignAttribute [Align]
    [10 Seattle..12 Athens]メモリ上のオブジェクトのアライメントを指定するものらしいが、For internal use only.とコメントあり
  • System.Classes ユニット
    ComponentPlatformsAttribute [ComponentPlatforms(<params>)]
    [XE2..12 Athens]コンポーネントが動作するプラットフォームを指定する
    パラメータ(Word値)にはSystem.Classesで定義されている以下の定数の論理和を指定する
    • pidWin32 [XE2..12 Athens]
    • pidWin64 [XE2..12 Athens]
    • pidOSX32 [XE2..12 Athens]
    • pidiOSSimulator32 [10.3 Rio..12 Athens], pidiOSSimulator [XE3..12 Athens]
    • pidAndroidArm32 [11 Alexandria..12 Athens], pidAndroid32Arm [10.3 Rio..12 Athens], pidAndroid [XE3..12 Athens]
    • pidLinux32 [XE3..12 Athens]
    • pidiOSDevice32 [XE8..12 Athens], pidiOSDevice [XE3..12 Athens]
    • pidLinux64 [XE8..12 Athens]
    • pidWinNX32 [XE3..12 Athens]
    • pidWinIoT32 [XE8..12 Athens] ("Embedded IoT (Internet of Things) Windows w/ Intel Galileo")
    • pidiOSDevice64 [XE8..12 Athens]
    • pidWinARM32 [10.3 Rio..12 Athens], pidWin32ARM [11 Alexandria..12 Athens], pidWinARM [10 Seattle..10.2 Tokyo]
    • pidOSX64 [10.1 Berlin..12 Athens], pidOSXNX64 [10.1 Berlin..10.2 Tokyo]
    • pidLinuxArm32 [11 Alexandria..12 Athens], pidLinux32Arm [10.1 Berlin..10.4 Sydney]
    • pidLinuxArm64 [11 Alexandria..12 Athens], pidLinux64Arm [10.1 Berlin..10.4 Sydney]
    • pidAndroidArm64 [11 Alexandria..12 Athens], pidAndroid64Arm [10.3 Rio..12 Athens], pidAndroid64 [10.1 Berlin..10.2 Tokyo]
    • pidiOSSimulator64 [10.3 Rio..12 Athens]
    • pidOSXArm64 [11 Alexandria..12 Athens]
    • pidWinArm64 [11 Alexandria..12 Athens]
    • pidiOSSimulatorArm64 [11 Alexandria..12 Athens]
    • pidWin64x [12 Athens]
    TDefaultAttributeBase
    [XE3..12 Athens]DefaultAttribute/NoDefaultAttributeの継承元
    DefaultAttribute [Default(<param>)]
    [XE3..12 Athens]プロパティの格納指定子defaultと同等の指定
    パラメータにはデフォルト値(Boolean型、AnsiChar型、Char型、Integer型、Cardinal型、Int64型、UInt64型、String型、Extended型のいずれか)を指定する
    NoDefaultAttribute [NoDefault]
    [XE3..12 Athens]プロパティの格納指定子nodefaultと同等の指定
    StoredAttribute [Stored(<param>)]
    [XE3..XE7]プロパティの格納指定子storedと同等の指定
    パラメータには真偽値(False | True)またはストレージハンドラ(Boolean型のプロパティまたはパラメータを持たずBoolean値を返すメソッド)の名前を指定する(XE8以降はSystemユニットに移動)
    ObservableMemberAttribute [ObservableMember(<param>)]
    [XE3..12 Athens]LiveBinding対応コンポーネントで、LiveBindingコンポーネントが式を生成するときに使用するメンバ名をパラメータで指定する
    ObservableMemberExtAttribute [ObservableMemberExt(<param>)/ObservableMemberExt(<param>,<param>)/ObservableMemberExt(<param>,<param>,<param>)]
    [10.4 Sydney]LiveBinding対応コンポーネントで、LiveBindingコンポーネントが式を生成するときに使用するメンバ名/フレームワーク/トラッキングをパラメータで指定する
  • System.JSON.Types ユニット
    JsonNameAttribute[JsonName<param>]
    [12 Athens]TJsonSerializerでキー名を明示的に指定
  • System.JSON.Serializers ユニット
    JsonConverterAttribute[JsonConverter<param>]
    [10.3 Rio..12 Athens]TJsonSerializerで使用するコンバータの指定
    JsonIgnoreAttribute[JsonIgnore]
    [10.3 Rio..12 Athens]TJsonSerializerで無視するメンバの指定
    JsonNameAttribute[JsonName<param>]
    [10.3 Rio..11 Alexandria]TJsonSerializerでキー名を明示的に指定(12 Athens以降はSystem.JSON.Typesユニットに移動)
    JsonInAttribute[JsonIn]
    [10.3 Rio..12 Athens]JsonSerialize属性のパラメータにTJsonMemberSerialization.Inを指定したときにTJsonSerializerでシリアライズ/デシリアライズ対象とする
    JsonObjectHandlingAttribute[JsonObjectHandling<param>]
    [10.3 Rio..12 Athens]TJsonSerializerでデシリアライズするときのクラス型のメンバの扱いを指定
    パラメータには列挙型TJsonObjectHandlingから以下のいずれかの値を指定
    • Auto [10.2 Tokyo..12 Athens]
    • Reuse [10.2 Tokyo..12 Athens]
    • Replace [10.2 Tokyo..12 Athens]
    JsonObjectOwnership[JsonObjectOwnership<param>]
    [10.3 Rio..12 Athens]TJsonSerializerでデシリアライズするときにクラス型メンバを生成した場合の元のインスタンスの扱いを指定
    パラメータには列挙型TJsonObjectOwnershipから以下のいずれかの値を指定
    • Auto [10.2 Tokyo..12 Athens]
    • Owned [10.2 Tokyo..12 Athens]
    • NotOwned [10.2 Tokyo..12 Athens]
    JsonSerializeAttribute[JsonSerialize<param>]
    [10.2 Tokyo..12 Athens]TJsonSerializerでシリアライズ/デシリアライズするメンバの指定
    パラメータには列挙型TJsonMemberSerializationから以下のいずれかの値を指定
    • Fields [10.2 Tokyo..12 Athens]
    • Public [10.2 Tokyo..12 Athens]
    • In [10.2 Tokyo..12 Athens]
  • Data.DBXJSONReflect ユニット (XE5でREST.JsonReflect ユニットに置き換えられた)
    JsonReflect [JsonReflect(<params>)]
    [XE..12 Athens]TJSONMarshal/TJSONUnMarshalでオブジェクトをJSON形式でマーシャル/アンマーシャルするときの動作をカスタマイズする
    パラメータにはコンバータタイプ、リバータタイプ、インターセプタの型、ポピュレーションカスタマイザの型、マーシャリングのときに生成される中間オブジェクトを自動的に解放するかどうかを指定する
    JSONBooleanAttribute
    [XE..12 Athens]JSONMarshalled/JSONOwnedの継承元
    JSONMarshalled [JSONMarshalled(<param>)]
    [XE..12 Athens]フィールドや型がマーシャル/アンマーシャルの対象になるかどうかをパラメータ(False | True)で指定する
    JSONOwned [JSONOwned(<param>)]
    [XE..12 Athens]フィールドがアンマーシャルの際に解放されるかどうかをパラメータ(False | True)で指定する
  • Datasnap.DSAuth ユニット
    TRoleAuth [TRoleAuth(<params>)]
    [XE..12 Athens]DataSnapで認証を行ったときに、サーバメソッドクラスやサーバメソッドに対してアクセスを許可/拒否するロールを指定する
    パラメータには許可ロールのリストと拒否ロールのリストを指定する
    参考: ロール (認証と権限付与)
  • REST.Json.Types ユニット
    JSONBooleanAttribute [JSONBoolean]
    [XE6..12 Athens]Data.DBXJSONReflect.JSONBooleanAttributeを参照
    JSONMarshalledAttribute [JSONMarshalled]
    [XE6..12 Athens]Data.DBXJSONReflect.JSONMarshalledを参照
    JSONOwnedAttribute [JSONOwned]
    [XE6..12 Athens]Data.DBXJSONReflect.JSONOwnedを参照
    JSONNameAttribute [JSONName]
    [XE6..12 Athens]12 AthensでSystem.JSON.Types.JsonNameAttributeのエイリアスになった
    JSONSerializeAttribute [JSONSerialize(<param>)]
    [12 Athens]データメンバシリアライズのオブジェクトタイプを指定
    パラメータには列挙型TJsonMemberSerializationから以下のいずれかの値を指定
    • jmFields [12 Athens]
    • jmPublicProps [12 Athens]
    • jmPublishedProps [12 Athens]
    • jmAllPubProps [12 Athens]
  • REST.JsonReflect ユニット
    JsonReflect(XE5)/JsonReflectAttribute(XE6以降) [JsonReflect]
    [XE5..12 Athens]Data.DBXJSONReflect.JsonReflectを参照(XE6でクラス名が変更)
    JSONBooleanAttribute [JSONBoolean]
    [XE5]Data.DBXJSONReflect.JSONBooleanAttributeを参照(XE6以降はREST.Json.Typesユニットに移動)
    JSONMarshalled [JSONMarshalled]
    [XE5]Data.DBXJSONReflect.JSONMarshalledを参照(XE6以降はREST.Json.Typesユニットに移動)
    JSONOwned [JSONOwned]
    [XE5]Data.DBXJSONReflect.JSONOwnedを参照(XE6以降はREST.Json.Typesユニットに移動)
  • EMS.ResourceTypes ユニット
    TResourceCustomAttribute [TResourceCustom]
    [10.1 Berlin..12 Athens] EndPointRequestSummaryAttribute(10.1 Berlin..10.2 Tokyo)/EndPointRequestParameterAttribute(10.1 Berlin..10.2 Tokyo)/EndPointResponseDetailsAttribute(10.1 Berlin..10.2 Tokyo)/EndPointObjectsYAMLDefinitionsAttribute(10.1 Berlin..10.2 Tokyo)/EndPointObjectsJSONDefinitionsAttribute(10.1 Berlin..12 Athens)/AllowAnonymousTenantAttribute(10.1 Berlin..10.2 Tokyo)/ResourceNameAttribute(10.3 Rio..12 Athens)/EndPointObjectsYAMLDefinitionsAttribute(10.3 Rio..12 Athens)の継承元
    TEndpointCustomAttribute [TEndpointCustom]
    [10.3 Rio..12 Athens]ResourceSuffixAttribute/EndpointNameAttribute/EndPointRequestSummaryAttribute/EndPointRequestParameterAttribute/EndPointResponseDetailsAttribute/AllowAnonymousTenantAttribute/EndPointProduceAttribute/EndPointMethodAttributeの継承元
    ResourceSuffixAttribute [ResourceSuffix]
    [XE7..12 Athens]EMSでURLのサフィックスを指定する
    参考: EMS リソースの概要 - RAD Studio
    ResourceNameAttribute [ResourceName]
    [XE7..12 Athens]EMSでリソース名を指定する
    参考: EMS リソースの概要 - RAD Studio
    EndpointNameAttribute [EndpointName]
    [XE7..12 Athens]EMSでエンドポイントメソッド名を指定する
    参考: EMS リソースの概要 - RAD Studio
    EndPointRequestSummaryAttribute [EndPointRequestSummary]
    [10.1 Berlin..12 Athens]EMSでメソッドの説明をAPIドキュメント上に生成する
    参考: カスタム API ドキュメント - RAD Studio
    EndPointRequestParameterAttribute [EndPointRequestParameter]
    [10.1 Berlin..12 Athens]EMSで要求内で使用されるパラメータの説明をAPIドキュメント上に生成する
    参考: カスタム API ドキュメント - RAD Studio
    EndPointResponseDetailsAttribute [EndPointResponseDetails]
    [10.1 Berlin..12 Athens]EMSで要求応答の説明をAPIドキュメント上に生成する
    参考: カスタム API ドキュメント - RAD Studio
    EndPointObjectsYAMLDefinitionsAttribute [EndPointObjectsYAMLDefinitions]
    [10.1 Berlin..12 Athens]EMSでYAML版のオブジェクトの定義をAPIドキュメント上に生成する
    参考: カスタム API ドキュメント - RAD Studio
    EndPointObjectsJSONDefinitionsAttribute [EndPointObjectsJSONDefinitions]
    [10.1 Berlin..12 Athens]EMSでJSON版のオブジェクトの定義をAPIドキュメント上に生成する
    参考: カスタム API ドキュメント - RAD Studio
    AllowAnonymousTenantAttribute [AllowAnonymousTenant]
    [10.2 Tokyo..12 Athens]EMSでテナント検証の手順をスキップする
    参考: サンプル RAD サーバー マルチテナント アプリケーション - RAD Studio
    EndPointProduceAttribute [EndPointProduce]
    [10.3 Rio..12 Athens]
    参考: RAD Server 拡張 URL マッピング - RAD Studio
    EndPointConsumeAttribute [EndPointConsume]
    [10.3 Rio..12 Athens]
    参考: RAD Server 拡張 URL マッピング - RAD Studio
    EndPointMethodAttribute [EndPointMethod]
    [10.3 Rio..12 Athens]
  • Macapi.ObjectiveC ユニット
    MethodNameAttribute [MethodName]
    [XE4..12 Athens]Delphiで定義したObjective-Cのメソッドに対して、Objective-C上の本来のメソッド名を指定する
  • Androidapi.JNIBridge ユニット
    JavaSignatureAttribute [JavaSignature]
    [XE5..12 Athens]Delphiで定義したAndroid(JNI)のクラス(インタフェース)に対して、Android上の本来のクラス名を指定する
  • System.Win.WinRT ユニット
    WinRTClassNameAttribute [WinRTClassName]
    [10 Seattle..12 Athens]Delphiで定義したWinRT APIのインタフェースに対して、WinRT上の本来のクラス名を指定する
Delphiのバージョンごとの違い:
  • Delphi 2010ではシステムで使用する定義済の属性はない。
  • Delphi XEではDataSnap関係でTRoleAuthと、DBX関係でJSONリフレクションのためのJSON...が定義された。
  • Delphi XE2ではマルチプラットフォーム対応のためにComponentPlatformsAttributeが定義された。
  • Delphi XE3ではARC対応としてWeakAttribute/UnsafeAttribute/RefAttributeが、またおそらく将来の旧RTTIから新RTTIへの移行のためにTDefaultAttributeBase/DefaultAttribute/NoDefaultAttribute/StoredAttributeが、LiveBinding対応のためにObservableMemberAttributeが、それぞれ定義された。
  • Delphi XE4ではiOS対応としてMethodNameAttributeが定義された。
  • Delphi XE5ではJSONのリフレクションがDBXから分離されたためData.DBXJSONReflectのJSON...がREST.JsonReflectにも再定義され、Android対応としてJavaSignatureAttributeが定義された。
  • Delphi XE6ではREST.JsonReflect.JsonReflectがREST.JsonReflect.JsonReflectAttributeにクラス名が変更され、JsonReflectAttribute以外のJson...の定義がREST.JsonReflectユニットからREST.Json.Typesユニットに移動した。
  • Delphi XE7ではStoredAttributeの定義がSystem.ClassesユニットからSystemユニットに移動し、EMSのためにResourceSuffixAttribute/ResourceNameAttribute/EndpointNameAttributeが定義された。
  • Delphi XE8ではHPPGENAttributeとHFAAttributeが定義された。
  • Delphi 10 SeattleではAlignAttributeとWinRTClassNameAttributeが定義された。
  • Delphi 10.1 Berlinでは全てのコンパイラで[weak][unsafe][volatile]属性がサポートされるようになった(10 Seattle以前はNEXTGENコンパイラのみ)。またEMS APIリソースの取得で使用するカスタムAPIドキュメント用のTResourceCustomAttribute/EndPointRequestSummaryAttribute/EndPointRequestParameterAttribute/EndPointResponseDetailsAttribute/EndPointObjectsYAMLDefinitionsAttribute/EndPointObjectsJSONDefinitionsAttributeが定義された。
  • Delphi 10.2 TokyoではSystem.JSON.Serializersユニットが追加されてJSONシリアライズ関係のJson...が定義され、EMSのマルチテナントサポートのためにAllowAnonymousTenantAttributeが定義された。System.JSON.Serializersユニットについては現時点(2017/04/10)で正式にドキュメントされていないため、LynaさんのDelphi 10.2 Tokyoのdocwikiに書かれてなさそうな変更点。 - 全力わはーTJsonSerializerの使い方。 - 全力わはーTJsonSerializerの実用例 - 全力わはーあたりを参照のこと。
  • Delphi 10.3 RioではEMS.ResourceTypesユニット上の属性クラスの継承関係が組み替えられた。
  • Delphi 10.4 SydneyではObservableMemberExtAttributeが定義されたが、11 Alexandriaで削除された。
  • Delphi 12 AthensではJsonNameAttributeの定義がSystem.JSON.Typesユニットに移動し、REST.Json.TypesユニットにJSONSerializeAttributeが定義された(System.JSON.SerializersユニットのJSONSerializeAttributeとは別のものらしい?)。
なおUnsafe属性のようにメソッドの戻値に属性を指定したい場合は、メソッドの宣言の前に[Result: <attr>]をつけて、
[Result: Unsafe]function Foo: TObject;
のようにします。

2015/06/19追記: Delphi XE6/XE7/XE8に関する情報を追加。

2015/10/05追記: Delphi 10 Seattleに関する情報を追加。

2016/05/02追記: Delphi 10.1 Berlinに関する情報を追加。

2017/04/10追記: Delphi 10.2 Tokyoに関する情報を追加。Lynaさんのところから大量に引用させていただきました。ありがとうございます。

2019/03/07追記: Delphi 10.3 Rioに関する情報を追加。

2023/12/21追記: Delphi 10.4 Sydney/11 Alexandria/12 Athensに関する情報を追加。

0 件のコメント: