新しいRTTIに含まれる属性機能ですが、Delphiのバージョンにより違いがあるものの、RTLで予め定義されている属性がいくつかあります。ところがこれらの定義済の属性についてヘルプにはきちんとした記述がありません。ということで調べてみました(
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(なにそれ)に情報があるらしいが詳細不明(ARM64プラットフォーム向けにレコード型/配列型に対して生成されたRTTI HFA情報をオーバライドFor internal use only.
とコメントあり) 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 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とは別のものらしい?)。
[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 件のコメント:
コメントを投稿