C#中实例成员的受保护访问权限?

时间:2012-12-10 08:35:02

标签: c# .net protected

  

可能重复:
  Why can’t I access C# protected members except like this?

当我正在阅读一本c#书(特别注释版本,它显示了c#的所有棘手部分)

我看到了这段代码:

public class A
{
    protected int x;
    static void F(A a, B b)
    {
        a.x = 1; // Okay
        b.x = 1; // Okay
    }
}
public class B: A
{
    static void F(A a, B b)
    {
        a.x = 1; // Error: must access through instance of B
        b.x = 1; // Okay
    }
}

关注protected意思是:

  

访问限于此类或从此类派生的类

问题

  • 为什么存在此限制(通过实例)?

  • 您能提供一个有问题的情况示例,就像它被允许一样吗?

2 个答案:

答案 0 :(得分:2)

您引用的受保护意义不是技术定义,而仅仅是规范引用的直观含义(第3.5.1节):

  

受保护的直观含义是“访问仅限于   包含从包含类“。

派生的类或类型

在同一部分中,它给出了更严格的定义(此处M是T类型的成员):

  

否则,如果M受保护,则允许访问(如果发生)   在声明M的类中,或者在M中发生的   从声明和发生M的类派生的类   通过派生类类型(§3.5.3)。

引用的部分(3.5.3)专门针对受保护的成员访问,并包含带有注释的示例:

  

此限制可防止一个派生类访问受保护的类   其他派生类的成员,即使成员是继承的   来自同一个基类。

因此答案很清楚。它旨在防止第三类做这样的事情:

public class C : A
{
  public static void F(A a, B b, C c)
  {
     a.x = 1; // not allowed
     b.x = 1; // not allowed
     c.x = 1; // allowed
  }
}

根据您对protected的定义,将允许前两个作业。这将是相当奇怪的。说我有我的图书馆,我定义了AB,但我让你继承A,你写了C。作为一个图书馆作者,我会有点担心,有些人可以修改我写的课程实例中的内部细节!当然,您可以通过属性或方法公开x中字段C的修改,但该行为仅限于您的类C的实例。

答案 1 :(得分:1)

这是你第二个问题的一个很好的答案

  

此限制可防止一个派生类访问其他派生的受保护成员       派生类,即使成员是从同一个基类继承的。

以下是现有问题的链接

Is there a way to reach a `protected` member of another object from a derived type?