C#中的protected和private protected有什么区别?

时间:2019-03-02 13:14:15

标签: c# access-modifiers

C#中“受保护的”和“受私有保护的”访问修饰符有什么区别? 有人可以举例说明吗?

谢谢。

2 个答案:

答案 0 :(得分:1)

关于acces modifier。更具体:继承和多个程序集。请考虑以下内容:

对于普通protected(与private一起解释):

class Base
{
    private bool X;
    protected bool Y;
}

class A : Base
{
    public void Foo()
    {
        X = false; //error: cannot access private member.
        Y = true; //can access protected member, but only from classes with `: Base`
    }
}

class B
{
    public void Foo()
    {
        A a = new A();

        a.X = false; //error: cannot access private member.
        a.Y = false; //error: cannot access protected member.
    }
}

现在与private protected的区别在于,它必须位于同一程序集中才能访问:

所以:

class A : Base
{
    public void Foo()
    {
        X = false; //error: cannot access private member.
        Y = true; //can access protected member, but only from classes with `: Base` AND 
                   //they need to be defined in the same assembly as Base
    }
}

有效,但仅当ABase都在同一程序集/ dll / exe等中进行编译时。


现在,既然很清楚,您什么时候use实际private protected

对此可以说很多。有些人(包括我)会认为使用private protected是一种反模式,因为在我看来,它与friend keyword紧密相关。我必须说,尽管与friend矛盾的是,private protected将“污垢”隔离开来,但这仍然是任意行为,逻辑,取决于其定义的位置。

说过的问题仍然存在,何时使用它。您可能会惊讶于我准时使用了一次,它非常有用。

请考虑以下情况:

  • 具有概念性的装饰器样式样式的代码库,例如某些graphical object系统。
  • 所有对象将以各种方式“可渲染”。
  • 因为您有很多东西,所以创建基类非常方便,只有您才可以使用它来获得便利。
  • 您不想让其他用户使用此功能,因为该文档没有充分的文档记录,并且确实针对您的实现进行了规范
  • 课程本身是公开的。

....然后我将使用private protected;-)

答案 1 :(得分:0)

私有保护旨在仅允许在同一程序集中(相同点网dll)的派生类(子级)内使用基类的受保护成员变量。

这意味着,如果您在程序集A中创建一个类,并且从另一个程序集B中定义的另一个类派生该类,则程序集A中的类将无法访问程序集B中该类的私有受保护成员变量。 / p>

但是,仅使用protected修饰符可以在派生类时在不同程序集中使用受保护的成员变量。

您还可以看一下内部修饰符,它是一种保护跨程序集的公共变量的类似机制。