C# 为什么这个私人会员可以访问?

C# 为什么这个私人会员可以访问?,c#,C#,我有这门课: 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); } } 测试代码为

我有这门课:

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提到的一个有用的链接:

//这很奇怪,这里不应该有味精

成员在类内可访问,在类外不可访问

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#允许类中的
实例.PrivateMember
,语言设计人员可能已经将private的使用限制为
this.PrivateMember
,以便只能使用当前实例访问private成员。如果是这种情况,那么您的代码将在
obj.msg=arg上引发错误。显然,C#设计人员选择了私有到实例的访问,而不是只对当前实例进行私有访问,因此基本规则是
private
成员可以在类内部访问,无论是使用
this
(当前实例)还是使用相同类型的实例。有关为什么这样做的更多讨论,您可以看到

Private意味着可以从同一类的方法访问它,而不必通过
this
访问它。这可能看起来很奇怪,但它仍然是同一个类,尽管它是不同的变量,而不是
这个


静态方法也可以做同样的事情。

如果我正确理解private,它意味着只能从同一个类中访问,而不仅仅是从该类的同一个实例中访问。

private
修饰符意味着只能在同一个类中访问,而不仅仅是在同一个实例中

private关键字是成员访问修饰符。私有访问是最低权限的访问级别只能在声明私有成员的类或结构体中访问私有成员。


我想我需要从字面上理解它。您用obj2.Output()调用的Output方法可以访问msg变量,但您不能用obj2.msgYes从外部访问它,但我觉得您没有解决他所谓的奇怪问题。在
F
方法中,传递了一个类型为
C
的本地对象,此对象实例仅在此处可用,因为该方法位于类
C
本身内部…@Killercam,我在回答中添加了这一点。@smwikipedia,我相信混淆是因为两个对象,但类型相同,我已经添加了一些额外的细节,我希望它现在更清楚。很好,不是吗?我在Java中重写“equals”方法时经常使用它