2017-05-29 8 views
6

どうすれば可能ですか?属性からプライベートconstフィールドにアクセスできるのはなぜですか?

namespace test 
    { 
     class Attr:Attribute 
     { 
      public Attr(int e) 
      { 
      } 
     } 

     [Attr(E)] 
     class Test 
     { 
      private const int E = 0; 
     } 
    } 

カプセル化の原則に違反していませんか?

+6

属性 'Attr'はクラス' Test'のメンバです。クラスのメンバーは、そのクラスのプライベートフィールドにアクセスできます。 –

+0

プライベートフィールドの値を別のクラスのctorに渡します。これはカプセル化を破ることと何が関係していますか?特に値の型を渡すとき。 – Karolis

+0

どのように動作しているのですか?いくつかのリンクを提供できますか?@JeroenVannevel – Vahe

答えて

3

いいえ、これはカプセル化に違反しません。属性宣言は論理的にクラスの一部です。 AttrTest.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では宣言の直後です)。

関連する問題