为什么私有成员变量可以被类实例更改?

时间:2010-11-22 11:13:07

标签: c# oop encapsulation instantiation private-members

class TestClass
{
    private string _privateString = "hello";
    void ChangeData()
    {
        TestClass otherTestClass = new TestClass();
        otherTestClass._privateString = "world";
    }
}

此代码在C#中编译,并且在PHP中等效,但是有人可以解释为什么otherTestClass._privateString可以在这里更改的原因吗?

我原以为某个类的实例在任何情况下都不应该能够更改私有成员变量,并且尝试访问otherTestClass._privateString会因“保护级别”错误而导致“无法访问”。

但事实并非如此,那么为什么在自己的类中实例化一个对象可以让你访问私有成员呢?如果它,这不会破坏封装到一定程度?或者我错过了一些明显的东西?

  • (我不是在问上面的班级设计是不是很好的做法,只是想知道它背后的理论。)

编辑 - 感谢您的回答和评论。为了澄清,我也有兴趣知道是否能够做到这一点被认为是一个积极的功能,或者它是否是更好的编译时检查/代码清晰度的必要权衡/因为大多数其他语言都是这样做的或者其他什么。在我看来,理想情况下编译器会阻止或警告你这一点,但后来我远离语言设计师。任何以这种方式如何让你做一些有用的事情(不违反封装)的例子都会很难或不可能。

2 个答案:

答案 0 :(得分:35)

该类程序文本中的任何代码都可以访问私有成员(包括嵌套类型中的代码)。它与您正在处理的类的哪个实例无关。

我不认为这违反了封装 - API仍然与实现分离,但实现“知道”自己,无论它在哪个实例上查看。

我相信在其他一些语言中,不是可访问性如何工作,但它绝对适用于C#和Java。 (Java对于可以访问私有成员的内容有一些不同的规则,但是你所编写内容的翻译代码仍然有效。)

答案 1 :(得分:9)

这是因为C#强制实施类级隐私,而不是对象级隐私。

大多数主流语言都实施相同的策略,即C#,C ++和Java。我认为原因是:

1)因为开发人员习惯于这种政策;

2)因为对象级别的隐私将变得非常繁琐,以回归很少的优势。