【发布时间】:2011-10-22 10:48:48
【问题描述】:
在 C#(和许多其他语言)中,访问相同类型的其他实例的私有字段是完全合法的。例如:
public class Foo
{
private bool aBool;
public void DoBar(Foo anotherFoo)
{
if (anotherFoo.aBool) ...
}
}
正如C# specification(第 3.5.1、3.5.2 节)所述,对私有字段的访问是在类型上,而不是在实例上。我一直在与一位同事讨论这个问题,我们正试图找出它为什么会这样工作的原因(而不是限制对同一实例的访问)。
我们能想到的最好的论点是用于相等性检查,其中类可能希望访问私有字段以确定与另一个实例的相等性。还有其他原因吗?或者某些黄金理由绝对意味着它必须像这样工作,否则完全不可能?
【问题讨论】:
-
替代方案有什么好处?
-
确实它不能很好地模拟现实世界。毕竟,仅仅因为我的车可以报告它还剩多少油,并不意味着我的车应该能够告诉每辆车还剩多少油。所以,是的,理论上我可以看到拥有“私有实例”访问权限。我觉得我真的永远不会使用它,因为我担心在 99% 的情况下,我真的希望让另一个实例访问该变量。
-
@Jon 对于所谓的“好处”所采取的立场是,类不应该知道另一个实例的内部状态——不管它是同一类型的事实。不是每个人说的好处,但可能有一个很好的理由选择一个而不是另一个,这就是我们一直试图弄清楚的
-
您总是可以将变量放入一对 getter/setter 闭包中,在构造函数中初始化,如果 this 与在初始化...
-
Scala 提供了 instance private 成员 -- 以及 Java、C# 和许多其他语言中没有的许多其他访问级别。这是一个完全合法的问题。
标签: c# oop language-design language-features private-members