请参阅以下代码:
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;
答案 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>