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

时间:2014-02-14 14:01:52

标签: 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);
    }
}

测试代码是:

C obj1 = new C();
C obj2 = new C();
obj1.F(obj2, "from obj1");
obj2.Output();

输出是:

from obj1

因此,从另一个对象obj1访问obj2的私有成员。我觉得这有点奇怪。

ADD

以下是Habib提到的有用链接:

Why are private fields private to the type, not the instance?

4 个答案:

答案 0 :(得分:33)

  

//这很奇怪,这里不应该访问msg。

private成员可在课堂内访问,无法在课程外访问。

Private - MSDN

  

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关键字是成员访问修饰符。私有访问是最不宽容的访问级别。 私有成员只能在类的主体或声明它们的结构体中访问。

     

来自C# Library