为什么类实例的私有成员在Equals()方法体中可用
本文关键字:方法 Equals 实例 成员 为什么 | 更新日期: 2023-09-27 18:07:58
可能重复:
为什么我的私处可以进入
为什么私有字段是类型的私有字段,而不是实例的私有字段?
很可能我错过了一个显而易见的事实,但我真的看不出原因:
当我重写Equals((方法并将对象强制转换为我的类型时,我可以毫无问题地调用其私有成员!!!
我正在初始化一个实例,我希望无法访问它的私人成员。
但是为什么casted对象在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)
{
var cat1 = new Animal(5, "HelloKitty");
var cat2 = new Animal(5, "HelloKitty");
Console.Write(cat1.Equals(cat2));
Console.Read();
}
}
私有成员是类的私有成员,而不是实例的私有成员。
在Animal类中,你可以访问你被传递(或者在这种情况下,成功地被传递到(的任何Animal实例的任何私人成员。
私有成员是可用的,因为它们是类的私有成员,而不是实例的私有成员。因为您在Animal
类中,所以您可以访问私有成员,即使是不同实例的私有成员。
这里有一个链接,链接到之前对该语言功能的讨论:为什么私有字段是类型的私有字段,而不是实例的私有字段?
因为public override bool Equals(object obj)
是类Animal
的一部分。
也许你会感到困惑,因为你认为Equals
是Animal
的静态成员,这样就无法看到Animal的私人成员。或者可能不是xD。