在C#(以及许多其他语言)中,访问相同类型的其他实例的私有字段是完全合法的.例如:
public class Foo
{
private bool aBool;
public void DoBar(Foo anotherFoo)
{
if (anotherFoo.aBool) ...
}
}
Run Code Online (Sandbox Code Playgroud)
由于C#规范(第3.5.1,3.5.2节)规定对私有字段的访问属于类型,而不是实例.我一直在与同事讨论这个问题,我们试图找出它之所以如此工作的原因(而不是限制对同一个实例的访问).
我们可以提出的最佳参数是进行相等性检查,其中类可能希望访问私有字段以确定与另一个实例的相等性.还有其他原因吗?或者一些绝对意味着它必须像这样或某种东西工作的黄金理由是完全不可能的?
很可能我错过了一个明显的事实,但我不能真正看到原因:
当我重写Equals()方法并将对象转换为我的类型时,我可以毫无问题地调用其私有成员!
我正在初始化一个实例,我希望它的私有成员不可访问.
但是为什么铸造的对象在Equals()方法中向我开放了它的私有部分?
请参阅下面示例代码中的Equals实现,并了解我如何到达"that"实例上的私有字段:
public class Animal
{
private string _name;
private int _age;
public Animal(int age, string name)
{
_name = name;
_age = age;
}
public override bool Equals(object obj)
{
var that = (Animal) obj;
//_name and _age are available on "that" instance
// (But WHY ??? )
return
this._age == that._age
&& this._name == that._name;
}
}
class Program
{
static void Main(string[] args)
{ …Run Code Online (Sandbox Code Playgroud)