同类的另一个实例可以访问私有字段

5
我不理解以下内容。我一直认为只有在声明该字段的类中才能访问私有字段。但是在这种情况下,我可以访问它:
class Session
{
    List<client> ListOfClients = new List<client>();

    public void IterateClients(Action<client> action)
    {

    }
}

class client
{
    private int A;

    Session area;

    public void SendData()
    {
        area.IterateClients(delegate(client c)
        {
            c.A = 5; //how come this is accessible?
        });
    }
}

1
你调用A的代码在client类中。问题是什么? - Oded
5个回答

7

只有在其所属的类中,才能访问私有数据。同一类的两个对象可以访问彼此的私有部分。

合法:

class c1
{
        private int A;

        public void test(c1 c)
        {
        c.A = 5;

        }

}

非法:

class c2
{
  public void test(c1 c)
  {
     c.A = 5;
  }
}

可能只是我个人的看法,但我认为一个特定类的对象不能访问另一个同类对象的私有字段(根据我理解你所写的)。这是在假设我们谈论的是不使用反射等方式简单地访问私有字段的情况下。 - Jarek
@Pako:那是不正确的,正如这里的每个答案所说的。 - SLaks
不,这并没有考虑到委托。但是匿名委托在技术上是客户端的成员,因此它可以访问私有成员。 - Sam Sussman
1
哈哈,我每天都能学到新东西。从未想过那样也可以行得通。我接受自己的错误并会尽量避免再犯 :) 感谢您指出这个问题。 - Jarek

6

这就是它应该工作的方式。

你的理解是错误的;私有成员不仅限于 this 限定符。


准确地说,规范表示私有/受保护方法可从类内部访问,而不是(实例化的)对象。 - Matthew

1

你是对的

我只能从声明该字段的类中访问私有字段

所以你正在从声明私有变量的类中访问私有字段。在Java中也允许这样做。


1

你在类client中有一个方法。在这个方法中,你调用了类Session的一个方法。在这个调用中,你有一个委托(一种“回调”),这个委托在类client的上下文中运行,因此可以访问私有成员A


0

从技术上讲,访问私有变量A的不是Session类本身,而是在SendData()中创建的委托函数。这没有问题。可以将其视为IterateClients只是调用来自client类的方法,该方法可以访问A变量,因为它在同一类中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接