c#中受保护和私有保护有什么区别? [重复]

问题描述 投票:-1回答:2

C#中'protected'和'private protected'访问修饰符之间有什么区别?有人可以用例子解释一下吗?

提前致谢。

c# access-modifiers
2个回答
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 ;-)


0
投票

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.