いいえ、これはカプセル化に違反しません。属性宣言は論理的にクラスの一部です。 Attr
がTest.E
にアクセスしていない(できません)場合はでAttr
のコンストラクタをTest
から呼び出しています。これは、メンバを初期化した場合と同じくらいうまくいきます。
C#の構文は、属性が何らかの理由でクラスの外側にあるように見える場合がありますが、そうではありません。このクラスのために産生されたILはこれです:
class Test
{
attribute Attr(E);
private const int E = 0;
}
これは宣言のスコープを強調しているだろうが、それを:
.class private auto ansi beforefieldinit test.Test
extends [mscorlib]System.Object
{
.custom instance void test.Attr::.ctor(int32) = (
01 00 00 00 00 00 00 00
)
// Fields
.field private static literal int32 E = int32(0)
...
} // end of class test.Test
は、C#が、それはこのような何かを見ているかもしれない同様の構文を採用していた
間違いなく明らかではないだろう。属性がメンバーに適用されると、それはさらにはっきりしなくなります(ILでは宣言の直後です)。
属性 'Attr'はクラス' Test'のメンバです。クラスのメンバーは、そのクラスのプライベートフィールドにアクセスできます。 –
プライベートフィールドの値を別のクラスのctorに渡します。これはカプセル化を破ることと何が関係していますか?特に値の型を渡すとき。 – Karolis
どのように動作しているのですか?いくつかのリンクを提供できますか?@JeroenVannevel – Vahe