为什么类实例的私有成员在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();
        }
    }

为什么类实例的私有成员在Equals()方法体中可用

私有成员是类的私有成员,而不是实例的私有成员。

在Animal类中,你可以访问你被传递(或者在这种情况下,成功地被传递到(的任何Animal实例的任何私人成员。

私有成员是可用的,因为它们是类的私有成员,而不是实例的私有成员。因为您在Animal类中,所以您可以访问私有成员,即使是不同实例的私有成员。

这里有一个链接,链接到之前对该语言功能的讨论:为什么私有字段是类型的私有字段,而不是实例的私有字段?

因为public override bool Equals(object obj)是类Animal的一部分。

也许你会感到困惑,因为你认为EqualsAnimal的静态成员,这样就无法看到Animal的私人成员。或者可能不是xD。