Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么类实例的私有成员在Equals()方法体中可用?_C#_.net_Oop_Clr_Equals - Fatal编程技术网

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

C# 为什么类实例的私有成员在Equals()方法体中可用?,c#,.net,oop,clr,equals,C#,.net,Oop,Clr,Equals,可能重复: 很可能我遗漏了一个明显的事实,但我看不出真正的原因: 当我重写Equals()方法时,当我将对象强制转换为我的类型时,我可以毫无问题地调用它的私有成员 我正在初始化一个实例,我希望它的私有成员无法访问 但是为什么铸造的对象会在Equals()方法中向我打开它的隐私? 请参阅下面示例代码中的Equals实现,并查看我是如何到达“that”实例上的私有字段的: public class Animal { private string _name; privat

可能重复:

很可能我遗漏了一个明显的事实,但我看不出真正的原因:

当我重写Equals()方法时,当我将对象强制转换为我的类型时,我可以毫无问题地调用它的私有成员

我正在初始化一个实例,我希望它的私有成员无法访问

但是为什么铸造的对象会在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
类中,所以您可以访问私有成员,即使是不同实例的成员


这里有一个链接指向之前对该语言功能的讨论:

因为
公共覆盖bool Equals(object obj)
是类
动物的一部分


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

您是否尝试过修改这些变量,以更改它们的值,请尝试一下,如果它起作用或不起作用,请进行响应。为了澄清OP,此行为与
Equals()
方法完全无关;在这方面并不特别。在
Animal
上定义的任何方法(包括静态方法)都可以访问给定的任何
Animal
对象上的私有成员。此行为与方法的静态性无关。事实上,它与此无关。它是关于将一个局外人对象投射到动物类,并且能够看到它的私有成员,甚至是一个局外人对象(但是在动物类内部,因此能够看到它的私有成员,即使对象不是“动物”)。我只是想猜为什么@pencilCake先生会感到困惑。