为什么可以从属性访问私有const字段?

时间:2017-05-29 09:31:15

标签: c# oop attributes encapsulation private-members

怎么可能?

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

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

它是否违反了封装原则?

1 个答案:

答案 0 :(得分:3)

不,这并不违反封装。属性声明在逻辑上是类的一部分。 Attr未访问Test.E(它无法访问),您正在Attr内使用E调用Test的构造函数。这和初始化成员一样好。

C#语法可能使其看起来像属于"外部"以某种方式上课,但事实并非如此。为这堂课制作的IL是:

.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#采用了类似的语法,它可能看起来像这样:

    class Test
    {
        attribute Attr(E);

        private const int E = 0;
    }

这会强调声明的范围,但可以说它不会那么清楚。当属性应用于成员时,它变得更加清晰(在IL中,这些属性直接遵循声明)。