【问题标题】:Private field accessible from another instance of the same class [duplicate]可从同一类的另一个实例访问的私有字段[重复]
【发布时间】:2011-12-19 19:19:50
【问题描述】:

我没有得到以下内容..我一直认为我只能从声明该字段的类中访问私有字段。但是在这种情况下我可以访问它:

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?
        });
    }
}

【问题讨论】:

  • 您调用A 的代码 client 类中。有什么问题?

标签: c# delegates field


【解决方案1】:

您只能从它所属的 CLASS 访问私有数据。同一类的两个对象可以访问彼此的私有部分。

法律:

class c1
{
        private int A;

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

        }

}

非法:

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

【讨论】:

  • 好吧,可能只有我一个人,但我不认为特定类的一个对象可以访问同一类的另一个对象的私有字段(据我了解您所写的内容)。这是假设我们谈论的是简单地访问私有字段而没有反射和其他东西。
  • @Pako:这不是真的,正如这里的每个答案所说的那样。
  • 不,这没有考虑到委托。但是匿名委托在技术上是客户端的成员,因此它可以访问私有成员。
  • 哈,好吧,我每天都学到新东西。从来没有想过这可能会奏效。我接受我的错误,并尽量不要再犯了:) 感谢您为我指出这一点。
【解决方案2】:

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

您的理解不正确;私人成员不限于this 限定符。

【讨论】:

  • 确切地说,规范说私有/受保护的方法可以从类内部访问,而不是(实例化的)对象。
【解决方案3】:

你是对的

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

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 2010-12-05
        • 1970-01-01
        • 1970-01-01
        • 2013-06-06
        • 2012-09-03
        • 1970-01-01
        相关资源
        最近更新 更多