c#中protected和private protected有什么区别?

what is the difference between protected and private protected in c#?

C# 中的 'protected' 和 'private protected' 访问修饰符有什么区别? 有人可以举例说明吗?

提前致谢。

这是关于 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 都编译在同一个 assembly/dll/exe 等


现在,既然这么清楚,你什么时候 use 一个真正的 private protected

关于这一点可以说很多。有些人(包括我)会争辩说 private protected 的使用是一种反模式,因为在我看来它与 friend keyword 密切相关。我必须说,尽管与 friend 相矛盾,private protected 使 "the dirt" 孤立,但它仍然是任意行为、逻辑,具体取决于其定义的位置。

话虽如此,问题依然存在,什么时候使用它。你可能会惊讶我准时使用了一次,而且很有帮助。

考虑以下情况:

  • 有一个概念性的、装饰模式风格的代码库,例如一些 graphical object 系统。
  • 所有对象都将以各种方式 "renderable"。
  • 因为你有很多,所以创建一个只有你自己使用的基础 class 很方便。
  • 您不希望让其他用户使用此功能,因为它没有很好的文档记录并且确实特定于您的实现
  • classes 本身是 public。

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

Private protected 意味着仅允许在同一个程序集(同一个点网络 dll)中的派生 classes(子)中使用基 class 的受保护成员变量。

这意味着如果您在程序集 A 中创建一个 class,并且您从另一个程序集 B 中定义的另一个 class 派生该 class,那么您的 class来自程序集 A 的程序集 B.

无法访问 class 的私有受保护成员变量

但是,仅使用 protected 修饰符允许在派生 classes 时跨不同程序集使用 protected 成员变量。

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