2017-10-17 26 views
0

请参阅下面的代码:为什么其他类的私有变量可以在.Equals中覆盖?

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; 
+0

但是 - 当你调用obj.TestVariable时,它会失败,因为它的私有性和有效性你是外在的 - 你不是使用“this”,而是你所在类的新版本无法看到..我有一个大脑(显然),你也可以问我脑中有什么,我可以告诉你,但你不能自己阅读,而你可以阅读你自己的,但我们都来自模板人(我希望) – BugFinder

+1

私人意味着(来自docs):“类型或成员只能由同一类或结构中的代码访问”。你的代码在同一个类中,所以它可以访问它。 – Evk

+0

我不知道C#,但它看起来不像是从另一个类访问的。看起来像在拥有它的类中访问的私有变量,这是完全正确的。 – Carcigenicate

回答

4

这里有两个不同的东西:

obj.TestVariable 

这不起作用,因为obj类型是object和类型object的情况下,没有一个TestVariable成员。所以访问它不会工作。

testClass.TestVariable 

然而,这会工作,因为testClass是同一类型,你目前的类型。这样一来,你是该类型的私人范围,这样你就可以访问私有变量,即使您所指的对象与this不同。

又见language documentation on the private modifier(重点煤矿):

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

嵌套类型同一机构也可以访问这些私人成员。

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

+0

谢谢,所以如果我在TestClass内部创建十个TestClass实例,那么我可以在TestClass内创建十一个TestClass实例的私有变量来创建它们? +1。 – w0051977

+0

是的,如果您在另一个TestClass实例的实例方法内创建了TestClass对象,则仍然可以访问该新实例的私有成员。 – poke

4

无障碍环境是不是实例,但类型

为什么:因为你是在类TestClass,并且可以访问所有的私有成员在那个班,即使你不是指this,但是你到达那里的一个实例。这是设计。

C#的郎规格提到它3.5.2下: ....

否则,如果M是私有的,访问被如果在M被声明的类型内发生它 允许。 ...

所以如果一个成员是私人的,你可以在同一个类型中访问它,而不仅仅是同一个实例。

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

+0

但我指的是TestClass的另一个实例? – w0051977

+0

@ w0051977:accessibbility不是关于实例,而是类型 –

1

我想你误解了private的意思。 private并不意味着您只能使用this.访问该成员。这意味着您只能在该课程中访问该成员。

Equals方法在TestClass之内,因此可以访问TestVariable。你正在访问哪个对象的TestVariable并不重要。

为什么要这样设计呢?

private整点不是限制对一个实例的访问,而是限制对实现的访问。当你声明private时,你不希望其他代码(可能由不知道实现细节的其他人编写)来混淆实现细节成员,因为它可能会弄脏一些东西。

相关问题