Hayır, bu enkapsülasyonu ihlal etmiyor. Özellik beyanı, mantıksal olarak sınıfa aittir. Attr
Test.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).
'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. –
Ö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
Nasıl çalıştığını nereden okuyabilirim? Bazı bağlantılar sağlayabilir misiniz? @JeroenVannevel – Vahe