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先生会感到困惑。