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

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

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

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

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

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

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

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

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

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

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

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

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

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