【发布时间】:2011-05-13 18:56:20
【问题描述】:
class TestClass
{
private string _privateString = "hello";
void ChangeData()
{
TestClass otherTestClass = new TestClass();
otherTestClass._privateString = "world";
}
}
这段代码在 C# 中编译,而在 PHP 中的等效代码,但是有人可以解释为什么 otherTestClass._privateString 可以在这里更改吗?
我原以为一个类的实例在任何情况下都不能更改私有成员变量,并且尝试访问 otherTestClass._privateString 会给出“由于保护级别而无法访问”错误。
但情况并非如此,那么为什么在其自己的类中实例化一个对象可以让您访问私有成员?而且,这不是在一定程度上破坏了封装吗?还是我遗漏了一些明显的东西?
- (我不是问上面的类设计是否是好的实践,只是想知道它背后的理论。)
编辑 - 感谢您的回答和 cmets。澄清一下,我也很想知道能够做到这一点是否被认为是一个积极的特性,或者它是否是更好的编译时检查/代码清晰度的必要权衡/因为大多数其他语言都是这样做的或其他方式。在我看来,理想情况下,编译器会阻止或警告你,但我离语言设计师还很远。任何关于这种方式的示例都可以让您做一些有用的事情(不违反封装),否则会很困难或不可能。
【问题讨论】:
-
顺便说一句:你可以创建
ChangeData()甚至static,你仍然可以访问私人成员。 -
@ulrichb - 重要提示 OP,如果
ChangeData()是static,则不能使用this关键字访问私有成员。 -
作为一种不同语言的示例 - 在 Ruby 中,public 是相同的,但 private 表示“只能由同一个实例访问”,而 protected 表示“只能从同一个类访问”。继承与那里无关。
标签: c# oop encapsulation instantiation private-members