我有这堂课:
class C
{
private String msg;
public void F(C obj, String arg)
{
obj.msg = arg; // this is strange, the msg shouldn't be accessible here.
}
public void Output()
{
Console.WriteLine(msg);
}
}
测试代码是:
C obj1 = new C();
C obj2 = new C();
obj1.F(obj2, "from obj1");
obj2.Output();
输出是:
from obj1
因此,从另一个对象obj1访问obj2的私有成员。我觉得这有点奇怪。
以下是Habib提到的有用链接:
Why are private fields private to the type, not the instance?
答案 0 :(得分:33)
//这很奇怪,这里不应该访问msg。
private
成员可在课堂内访问,无法在课程外访问。
private关键字是成员访问修饰符。私人访问是 最低许可访问级别。私人会员只能访问 在类的主体内或它们所在的结构中 声明
对于您的其他问题:
因此,从另一个对象obj1访问obj2的私有成员。一世 认为这有点奇怪。
您正在将obj2
的地址传递给obj1
的实例方法,然后在方法中访问obj2
的私有成员msg
并更改其值。 但由于它们都属于同一类型,因此您会觉得您正在访问其他类私有成员。
尝试使用两个不同的类,您将能够更好地理解它。
考虑是否有另一个类定义为:
class B
{
public void SomeMethod(C obj, string arg)
{
obj.msg = arg; // that is an error.
}
}
现在您无法访问私有成员msg
,因为您试图在课外访问它,在您的示例中,您正在访问类内部类成员。
可能存在一个争论,即为什么C#允许instance.PrivateMember
在类中,语言设计者可能将私有使用限制为this.PrivateMember
,因此私有成员只能使用当前实例访问。如果情况确实如此,那么您的代码会在obj.msg = arg;
上引发错误。显然,C#设计者选择私有实例访问而不是私有到当前实例,因此基本规则是private
成员可以在类中访问,无论是this
(当前实例) )或与相同类型的实例。有关此操作的详细信息,请参阅this question
答案 1 :(得分:13)
如果我正确理解私有,则表示只能从同一个类中访问,而不仅仅是来自该类的相同实例。
答案 2 :(得分:9)
私有意味着可以从同一个类的方法访问它,而不是必须通过this
访问它。它可能看起来很奇怪,但它仍然是同一个类,即使它是不同的变量而不是this
。
静态方法可以做同样的事情。
答案 3 :(得分:3)
private
修饰符意味着它只能在同一个类中访问 - 不仅是同一个实例。
private关键字是成员访问修饰符。私有访问是最不宽容的访问级别。 私有成员只能在类的主体或声明它们的结构体中访问。