class TestClass
{
private string _privateString = "hello";
void ChangeData()
{
TestClass otherTestClass = new TestClass();
otherTestClass._privateString = "world";
}
}
这段代码可以在C#中编译,等效代码也可以在PHP中工作,但是有人能解释一下为什么这里可以更改otherTestClass._privateString
吗?我原以为类的实例在任何情况下都不能更改私有成员变量,并且尝试访问otherTestClass._privateString
会出现“无法访问由于保护级别”的错误。但事实并非如此,那么为什么在其自己的类内部实例化一个对象会让您访问私有成员呢?这样做是否应该,这不会在一定程度上破坏封装性吗?或者我错过了一些明显的东西吗?(我不是在询问上述类设计是否是良好的实践,只是想知道其中的理论。)
编辑 - 感谢答案和评论。为了澄清,我也想知道能否将其视为积极的特征,或者它是否是更好的编译时检查/代码清晰度/因为大多数其他语言都是这样做的必要权衡。对我来说,理想情况下,编译器将防止或警告您进行此操作,但我远非语言设计师。任何关于它以这种方式让您执行某些有用操作(而不违反封装)的示例都将是极好的。
ChangeData()
改成static
静态函数,这样你仍然可以访问私有成员。 - ulrichbChangeData()
是静态的,那么您不能使用this
关键字来访问私有成员。 - TheCloudlessSky