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

Sal*_*ris 2 c# access-modifiers

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

提前致谢。

Ste*_*fan 5

这是关于access 修饰符的。更具体地说:继承和多个程序集。考虑以下:

对于正常情况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.
    }
}
Run Code Online (Sandbox Code Playgroud)

现在的区别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
    }
}
Run Code Online (Sandbox Code Playgroud)

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


现在,既然已经清楚了,你什么时候会use真正的private protected

关于这一点可以说很多。有些人(包括我)会认为使用private protected是一种反模式,因为在我看来它与friend关键字密切相关。我必须说,尽管与 矛盾friendprivate protected保持“污垢”孤立,但它仍然是任意行为、逻辑,取决于它定义的位置。

话虽如此,问题仍然是,何时使用它。你可能会惊讶于我准时使用过它一次,而且它非常有帮助。

考虑以下情况:

  • 拥有一个概念性的、装饰器模式风格的代码库,例如某个graphical object系统。
  • 所有对象都将以各种方式“可渲染”。
  • 因为你有很多东西,所以创建一个只有你自己使用的基类会很方便。
  • 您不想让其他用户使用此功能,因为它没有很好的记录并且真正特定于您的实现
  • 课程本身是公开的。

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

  • 我认为你问错了。它是受保护的与私有的受保护的,而不是受保护的与私有的。 (2认同)