2017-05-29 55 views
6

Bu nasıl mümkündür?Özel const alanına öznitelikten erişmek neden mümkündür?

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

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

o kapsülleme ilkesini ihlal etmiyor mu?

+6

'Attr' özniteliği 'Test' sınıfının bir üyesidir. Bir sınıfın bir üyesinin o sınıfın özel alanlarına erişimi vardır. –

+0

Özel alan değerini başka bir sınıfın ctoruna geçirirsiniz. Bunun kapsüllenmeyi kırmakla ne ilgisi var? Özellikle de değer tipini geçtiğinizde. – Karolis

+0

Nasıl çalıştığını nereden okuyabilirim? Bazı bağlantılar sağlayabilir misiniz? @JeroenVannevel – Vahe

cevap

3

Hayır, bu enkapsülasyonu ihlal etmiyor. Özellik beyanı, mantıksal olarak sınıfa aittir. AttrTest.E erişemiyor, (Attr) E yapıcıdan Test içinden arıyorsunuz. Bu, bir üyeyi başlatıyormuş gibi iyi.

C# sözdizimi, niteliğin bir şekilde "dışarıda" olduğu gibi görünebilir, ancak durum böyle değil. Bu sınıf için üretilen IL şudur:

class Test 
    { 
     attribute Attr(E); 

     private const int E = 0; 
    } 

Bu bildirinin kapsamı vurguladı olurdu, ama bunu:

.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#, böyle bir şey görünüyor olabileceğini de benzer bir sözdizimi kabul Had

tartışmasız açıklık olmazdı. Nitelikler üyelere uygulandığında daha da netleşir (IL'de, bunlar doğrudan bildirimi takip eder).

İlgili konular