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

6

如何可能实现呢?

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

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

这不违反了封装原则吗?


6
属性 Attr 是类 Test 的成员。类的成员可以访问该类的私有字段。 - Jeroen Vannevel
将私有字段的值传递到另一个类的ctor中。这与破坏封装有什么关系?特别是当您传递值类型时。 - Karolis Kajenas
我可以在哪里阅读它是如何工作的?你能提供一些链接吗?@JeroenVannevel - Vahe
1个回答

3
不,这不违反封装。属性声明在逻辑上是类的一部分。Attr没有访问Test.E(它不能),你是在Test中调用E的构造函数来初始化Attr,这与初始化成员变量一样好。
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中,这些紧跟在声明后面),情况变得更不清晰。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接