c#中受保护和私有保护有啥区别? [复制]

Posted

技术标签:

【中文标题】c#中受保护和私有保护有啥区别? [复制]【英文标题】:what is the difference between protected and private protected in c#? [duplicate]c#中受保护和私有保护有什么区别? [复制] 【发布时间】:2019-07-24 07:53:33 【问题描述】:

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

提前致谢。

【问题讨论】:

docs.microsoft.com/en-us/dotnet/csharp/programming-guide/… 【参考方案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 ;-)

【讨论】:

我认为你的问题错了。它的受保护与私有保护,而不是受保护与私有。 哦,哈哈,我的错 :-) 我的理解是,对于受保护的-受保护的成员可以在其类中访问,并且可以通过派生类实例访问,而与程序集无关,而对于私有受保护的-私有受保护的成员可以通过从包含的类型派生的类型访问类,但仅在其包含的程序集中。如果我错了,请纠正我。 是的,你是对的。 谢谢斯特凡。感谢您的支持。【参考方案2】:

私有保护意味着只允许在同一程序集(相同的 dot net dll)内的派生类(子类)中使用基类的受保护成员变量。

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

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

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

【讨论】:

以上是关于c#中受保护和私有保护有啥区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

受保护和私有有啥区别? [复制]

“私有”和“受保护的内部”有啥区别?

受保护的与私有的析构函数

“私有”、“公共”和“受保护的方法”之间有啥区别?

可以通过反射类访问的公共,私有,受保护类有啥用? [复制]

python中受保护变量和公共变量有啥区别