为什么另一个类的私有变量可以在.Equals中覆盖?

时间:2017-10-17 11:10:30

标签: c#

请参阅以下代码:

public class TestClass
{
    private int TestVariable;

    public override bool Equals(object obj)
    {
        TestClass testClass = obj as TestClass;
        return TestVariable == testClass.TestVariable;
    }
}

这行如何编译:

return TestVariable == testClass.TestVariable;

TestVariable是私有的,正在外部访问。如果我将行更改为this,则它不会像我期望的那样编译:

return TestVariable == obj.TestVariable;

3 个答案:

答案 0 :(得分:4)

辅助功能不是关于实例而是类型

为什么:因为你在班级TestClass并且可以访问该班级中的每个私人成员,即使你没有提到this,也可以访问你到达那里的实例。这是设计的。

C#lang规范在3.5.2下提到它: ....

  

否则,如果M是私有的,则允许访问(如果发生)   在声明M的类型中。 ...

因此,如果某个成员是私有的,您可以在同一类型中访问它,而不仅仅是同一个实例。

旁注:如果没有以这种方式实现,就不可能提供一个复制构造函数来接受另一个实例来初始化它,因为某些属性可能无法访问。

答案 1 :(得分:4)

这里有两件不同的事情:

obj.TestVariable

这不起作用,因为obj的类型为object,而object类型的实例没有TestVariable成员。因此访问它将无法正常工作。

testClass.TestVariable

但这可行,因为testClass与您当前所使用的类型的类型相同。这样,您在该类型的私有范围内,因此您可以访问私有变量,即使您引用的对象与this不是同一个对象。

另见language documentation on the private modifier(强调我的):

  

私人成员只能在类<+ strong>的或声明它们的结构中访问[...]

     

同一主体中的嵌套类型也可以访问这些私有成员。

因此,由于您仍然在类中,您可以访问该成员。如下段所述,这甚至可以在嵌套类型中运行,尽管嵌套类型是一种完全不同的类型,与其父类没有必需的类型关系。但它起作用,因为嵌套类型定义在其父类型的主体内

答案 2 :(得分:1)

我认为你误解了private的含义。 private并不意味着您只能使用this.访问该成员。这意味着您只能访问该类中的该成员。

Equals方法位于TestClass内,因此可以访问TestVariable。您访问的对象TestVariable无关紧要。

为什么要这样设计?

private的重点不是限制对一个实例的访问,而是限制对实现的访问。当您将某些内容声明为private时,您不希望其他代码(可能由不了解实现细节的其他人编写)混淆实现详细信息成员,因为它可能会弄乱内容。 / p>