2012-02-06 7 views
12

アトリビュートは実際にはアセンブリにアタッチされたメタデータなので、アトリビュートオブジェクトはリクエスト(GetCustomAttributesを呼び出すときなど)でのみ作成されます。属性オブジェクトはいつ作成されますか?

オブジェクトの作成時に作成されますか?

または、CLRによる属性スキャンによってオブジェクトが作成されたときに作成された最初の2つの組み合わせ? C#の、第三版を経由してCLRから

+0

[.NETの属性:なぜGetCustomAttributes()は毎回新しい属性インスタンスを作成するのですか?](http://stackoverflow.com/q/417275/319403)あなたの質問に答えることさえあるかもしれません。 – cHao

+0

仕方がありません。実際の質問は私にとっては問題ではありませんでしたが、途中で答えが出ました。 @Smiを介して)CLRの本からの聖句も持っているのは良いことです。 – Dann

答えて

8

あなたは属性オブジェクトを構築したい場合は、あなたがGetCustomAttributesまたは GetCustomAttributeのいずれかを呼び出す必要がありますが。これらのメソッドの1つが呼び出されるたびに、指定された属性タイプの新しいインスタンス が構築され、ソースコードで指定された値に基づいて各インスタンスのフィールドとプロパティが設定されます。これらのメソッドは、適用された属性クラスの完全に構築されたインスタンスへの参照を返します。

はい、リクエストに応じて作成されます。

4

リクエストに応じて作成されます。

たとえば、.NET 3.0アトリビュートを.NET 2.0アセンブリに追加すると(WCF DataContractAttributeなど)、.NETを持たないマシンでも.NET 2.0アセンブリを使用できるようになります3.0がインストールされています。ただし、属性にアクセスしようとするコードはありません。

2

属性はコード生成にも影響しません。一部の属性は、コンパイラ[DllImport]などで解釈されます。いくつかはジッタによって発見され、[MethodImpl]などです。これは、属性を利用するために書かれたフレームワーク内の他のツールやクラスに無限に拡張されています。

しかし、これらのツールは、独自の属性を見つけたい場合は、GetCustomAttributes()を呼び出す必要があります。この種のコードはオブジェクトのインスタンスには決して関連付けられません。属性は型に適用されます。

+0

したがって、システムに属している属性( "DllImport")は、オブジェクトを作成して利用するのではなく、メタデータとしてそのままパースしますか? – Dann

+1

実際に属性を使って*行うツールはどこにでもあります。 –

関連する問題