掲示板お問い合わせランダムジャンプ



この広告は30日以上更新がないブログに表示されております。 新しい記事を書くことで広告を消すことができます。

Top Index

2014年09月28日
AttributeクラスのInheritedプロパティって何ぞ?

Attribute.Inherited プロパティ

参考:カスタム属性の記述
http://msdn.microsoft.com/ja-jp/library/84c42s56(v=vs.100).aspx
Inherited プロパティは、属性が適用されるクラスから継承されるクラスが、その属性を継承できるかどうかを指定します。
このプロパティには、true (既定値) または false のいずれかのフラグが指定できます。

「属性が適用されるクラスから〜」といってますので、
クラス向け属性の情報だから、プロパティ向け属性とかで指定しても意味ないよ。
クラス向けの属性の場合、継承したクラスにもその属性を引き継ぐかどうかを指定してね
(初期値は継承先でも有効だよ)。


ふむふむ。特に変なところはないですね。
これだけなら特に迷うことはない…が、ことはそうはいかない。

MemberInfo.GetCustomAttributes メソッド
inherit パラメーター

参考:MemberInfo.GetCustomAttributes メソッド (Boolean)
http://msdn.microsoft.com/ja-jp/library/kff8s254(v=vs.110).aspx
パラメーター
inherit型 : System.Boolean
このメンバーの継承チェーンを検索して属性を見つける場合は true。それ以外の場合は false。
プロパティおよびイベントの場合、このパラメーターは無視されます。「解説」を参照してください。
(中略)
解説
このメソッドでは、プロパティおよびイベントの inherit パラメーターは無視されます。
プロパティおよびイベントの継承チェーンを検索して属性を見つけるには、Attribute.GetCustomAttributes メソッドの適切なオーバーロードを使用します。

読み込む関数側にも「継承ってどうする?」という引数があることです。
?どういうこと?

というわけでその辺の相関関係を洗う。


通常クラス 読み取り可否

Attribute.IsInherited = True Attribute.IsInherited = False
GetCustomAttributes(True) Yes Yes
GetCustomAttributes(False) Yes Yes

属性が書かれているクラスはinheritedがどうなっていようが読み取りできる。

継承クラス 読み取り可否

Attribute.IsInherited = True Attribute.IsInherited = False
GetCustomAttributes(True) Yes No
GetCustomAttributes(False) No No


継承クラスは属性、読み取り関数ともにTrueでないと読み込めない。
使い分けるのむずい。

最後に速度でも調べておこう。


通常クラス 速度(msec)(.NET4)

Attribute.IsInherited = True Attribute.IsInherited = False
GetCustomAttributes(True) 0.0150 0.0142
GetCustomAttributes(False) 0.0119 0.0113

GetCustomAttributes(False)の方が若干速い。


継承クラス 速度(msec)(.NET4)

Attribute.IsInherited = TrueAttribute.IsInherited = False
GetCustomAttributes(True)0.02010.0136
GetCustomAttributes(False)0.00310.0032

GetCustomAttributes(True)・Attribute.IsInherited = Trueが圧倒的に遅く、
GetCustomAttributes(False)の方が圧倒的に速い。
(見に行かなくていいんだからそりゃそうだ)

とはいっても、それぞれに意味はあるわけだから、
GetCustomAttributes(False)を使えばOKとかいう訳にもいかない。

まとめ

まともに使おうとするとかなりややこしい。
「気を付けましょう」ぐらいしか言いようがない。

さて、これ使いこなせる人ってどんなけいるんだろうか。
クラス属性に限った話だから、まだましかもしれないけど。
[ 投稿者:mk3008 at 16:39 | VB.NET | コメント(0) | トラックバック(0) ]

この記事へのコメント

この記事へのトラックバック

この記事へのトラックバックURL
http://shinshu.fm/MHz/88.44/a02480/0000450644.trackback

この記事の固定URL
http://shinshu.fm/MHz/88.44/archives/0000450644.html

記事へのコメント
 
簡単演算認証: 3 x 1 + 5 =
計算の答えを半角英数字で入力して下さい。
名前: [必須]
URL/Email:
タイトル:
コメント:
※記事・コメントなどの削除要請はこちら