2

私は、C# の属性が遅延インスタンス化されているように見えることを発見しました。

[A(123)]
class A : Attribute
{
    public A(int b)
    {
        GetType().GetCustomAttributes(true);
    }
}

この例では、新しいAインスタンスを作成するStackOverflowExceptionと が発生しますが、 への呼び出しを削除するとGetCustomAttributes()、実行は正常に続行されます。

どうしてこれなの?装飾するクラスが適切である場合、属性が適切に初期化されることは、私にとってより理にかなっています。

4

3 に答える 3

3

要求する前に、ランタイムがクラスのすべての属性をインスタンス化する必要があるのはなぜですか? 後で使用したい場合に備えて、ランタイムがクラスのインスタンスを事前に作成しない理由を尋ねるようなものです。

属性はクラスのメタ データであり、クラスの動作にはまったく影響しません。属性を要求するコードのみがそれを気にし、他の誰も気にしません。したがって、現在の動作は理にかなっています。

于 2010-09-02T05:39:51.003 に答える
2

属性機能は、問題の属性を積極的に探しているコードによってのみ実行されるため、ランタイムが最初に使用されるまで属性をインスタンス化するのは無駄です。実際、プログラムの存続期間中、属性は決して検査されない可能性があります。

于 2010-09-02T05:40:43.633 に答える
1

属性は、インスタンスではなく、タイプに関連付けられた「情報」です。
アタッチされているタイプのオブジェクトを作成するときにインスタンス化する必要がある理由はありません。代わりに、タイプ自体を調べているときにそれらを見ることができます。

于 2010-09-02T06:30:23.077 に答える