【问题标题】:Why private members of a class instance are getting available in Equals() method body? [duplicate]为什么类实例的私有成员在 Equals() 方法体中可用? [复制]
【发布时间】:2011-11-11 09:35:29
【问题描述】:

可能重复:
Why are my privates accessible?
Why are private fields private to the type, not the instance?

很可能我错过了一个明显的事实,但我看不出原因:

当我重写 Equals() 方法并将对象转换为我的类型时,我可以调用它的私有成员没有任何问题!!!

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

但是为什么被转换的对象在 Equals() 方法中向我打开了它的私有部分?

请参阅下面示例代码中的 Equals 实现,看看我是如何到达“那个”实例上的私有字段的:

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

【问题讨论】:

  • 您是否尝试过修改这些变量,以更改它们的值,请您尝试一下并回复是否有效。

标签: c# .net oop clr equals


【解决方案1】:

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

在 Animal 类中,您可以访问传递给您的任何 Animal 实例的任何私有成员(或者,在本例中,成功转换为)。

【讨论】:

  • 为了澄清OP,这种行为与Equals()方法无关;在这方面并不特别。在Animal 上定义的任何方法(包括静态方法)都可以访问给定的任何Animal 对象上的私有成员。
【解决方案2】:

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

这里是该语言功能先前讨论的链接:Why are private fields private to the type, not the instance?

【讨论】:

    【解决方案3】:

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

    也许您会感到困惑,因为您认为 EqualsAnimal 的静态成员,并且这样就无法看到 Animal 的私有成员。或者也许不是 xD。

    【讨论】:

    • 这种行为与方法的静态性无关。
    • 确实没有。这是关于将外部对象投射到 Animal 类并能够看到它的私有成员,甚至是外部对象(但在 Animal 类内部,因此能够看到它的私有成员,即使对象不是“Animal” )。我只是想猜测为什么先生。 @pencilCake 很困惑。
    猜你喜欢
    • 2011-05-13
    • 2011-02-06
    • 2014-04-02
    • 2013-11-13
    • 2018-12-02
    • 2022-01-23
    • 2012-10-23
    • 2020-01-08
    相关资源
    最近更新 更多