C# 为什么另一个类的私有变量可以在.Equals重写中访问?

C# 为什么另一个类的私有变量可以在.Equals重写中访问?,c#,C#,请参阅下面的代码: public class TestClass { private int TestVariable; public override bool Equals(object obj) { TestClass testClass = obj as TestClass; return TestVariable == testClass.TestVariable; } } 这一行如何编译: return TestVa

请参阅下面的代码:

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是私有的,正在外部访问。如果我将行更改为此,则它不会像我预期的那样编译:

return TestVariable == obj.TestVariable;

可访问性不是关于实例,而是关于类型

原因:因为您在TestClass类中,可以访问该类中的每个私有成员,即使您不是在引用它,而是在引用一个实例。那是故意的

C语言规范在第3.5.2节中提到:

否则,如果M是私有的,则允许访问 在声明M的类型中

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


旁注:如果不是以这种方式实现的,则不可能提供一个副本构造函数,该构造函数将采用另一个实例来初始化该实例,因为某些属性可能无法访问。

这里有两个不同的内容:

obj.TestVariable
这不起作用,因为obj的类型是object,而type对象的实例没有TestVariable成员。因此,访问它将不起作用

testClass.TestVariable
但是,这将起作用,因为testClass的类型与您当前所在的类型相同。这样,您就处于该类型的私有范围内,因此您可以访问私有变量,即使您引用的对象与此对象不同

另见重点:

私有成员只能在声明它们的类或结构体中访问[…]

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


因此,由于您仍在类的主体中,因此可以访问该成员。正如下面的段落所解释的,这甚至可以在嵌套类型内工作,尽管嵌套类型是完全不同的类型,与其父类型没有必需的类型关系。但它可以工作,因为嵌套类型定义位于其父类型的主体内

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

Equals方法位于TestClass内部,因此可以访问TestVariable。访问哪个对象的TestVariable并不重要

为什么要这样设计呢


private的全部目的不是限制对一个实例的访问,而是限制对实现的访问。当你宣布某物为私人时,您不希望其他可能由不了解实现细节的人编写的代码与实现细节成员混在一起,因为这可能会把事情搞砸。

但是-当您调用obj.TestVariable时,它会失败,因为它是私有的,实际上您是它的外部成员-您使用的不是它,而是一个新的变量你所在班级的版本你看不到。。我有一个大脑显然你也是,你可以问我大脑里有什么,我可以告诉你,但是你自己读不懂,而你可以自己读,但我们都来自人类模板,我希望来自文档:类型或成员只能通过同一类或结构中的代码访问。。你的代码在同一个类中,所以它可以访问它。我不知道C,但它看起来不像是从另一个类访问的。看起来像是在拥有它的类中访问了一个私有变量,这很好。但我指的是TestClass的另一个实例?@w0051977:Accessibility不是关于实例,而是关于TypesHanks,所以如果我在TestClass中创建十个TestClass实例,然后我可以在创建它们的TestClass内创建11个TestClass实例的私有变量+1.是的,如果您在另一个TestClass实例的instance方法中创建TestClass对象,您仍然可以访问该新实例的私有成员。