Подтвердить что ты не робот

Почему частные члены экземпляра класса доступны в теле метода Equals()?

Возможный дубликат:
Почему мои частные лица доступны? Почему частные типы являются закрытыми для типа, а не экземпляра?

Скорее всего, мне не хватает очевидного факта, но я не могу понять причину:

Когда я переопределяю метод Equals(), и когда я бросаю объект в свой тип, , я могу вызвать его частных членов без каких-либо проблем!!!

Я инициализирую экземпляр, и я ожидаю, что его частные члены не будут доступны.

Но почему литой объект открывает мне свои ряды в методе Equals()?

См. реализацию Equals на примере кода ниже и посмотрите, как я попадаю в частные поля в экземпляре "this":

 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();
        }
    }
4b9b3361

Ответ 1

Частные члены являются частными для класса, а не для экземпляра.

Внутри класса Animal вы можете получить доступ к любым частным членам любого экземпляра Animal, который вы передали (или, в этом случае, успешно нажали).

Ответ 2

Частные члены доступны, потому что они являются частными для класса, а не для экземпляра. Поскольку вы находитесь в классе Animal, вы можете получить доступ к закрытым членам, даже из другого экземпляра.

Здесь ссылка на предыдущее обсуждение этой языковой функции: Почему частные типы являются закрытыми для типа, а не экземпляра?

Ответ 3

Потому что public override bool Equals(object obj) является частью класса Animal.

Возможно, вы запутались, потому что считали, что Equals является статическим членом Animal и, таким образом, не может видеть частных членов Animal. Или, может быть, не xD.