Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#中受保护和私有保护的区别是什么?_C#_Access Modifiers - Fatal编程技术网

c#中受保护和私有保护的区别是什么?

c#中受保护和私有保护的区别是什么?,c#,access-modifiers,C#,Access Modifiers,C#中的“受保护”和“受私有保护”访问修饰符有什么区别? 有人能举例说明吗 提前谢谢。这是关于。更具体:继承和多个程序集。考虑以下事项: 对于正常的受保护的(随专用一起解释): 现在,私有保护的区别在于,它必须位于同一程序集中才能访问: 因此: 有效,但仅当A和Base都在同一程序集/dll/exe等中编译时有效 现在,既然清楚了,你什么时候会使用真正的受私人保护的 关于这一点可以说很多。一些人(包括我)会认为使用私有保护的是一种反模式,因为在我的观点中,它与。我必须说的是,尽管与《朋友》(

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

提前谢谢。

这是关于。更具体:继承和多个程序集。考虑以下事项:

对于正常的
受保护的
(随
专用
一起解释):


现在,
私有保护
的区别在于,它必须位于同一程序集中才能访问:

因此:

有效,但仅当
A
Base
都在同一程序集/dll/exe等中编译时有效


现在,既然清楚了,你什么时候会使用真正的受私人保护的

关于这一点可以说很多。一些人(包括我)会认为使用私有保护的
是一种反模式,因为在我的观点中,它与。我必须说的是,尽管与《朋友》(friend)相反,《私人保护》(private protected)将“污垢”隔离,但它仍然是任意行为、逻辑,取决于其定义的位置

话虽如此,问题仍然存在,何时使用它。你可能会惊讶于我曾经准时使用过它,而且它非常有用

考虑以下情况:

  • 具有概念性的、装饰模式样式化的代码库,例如一些
    图形对象
    系统
  • 所有对象都将以各种方式“可渲染”
  • 因为您有很多,所以创建一个仅为方便而使用的基类非常方便
  • 您不希望让其他用户使用此功能,因为它没有很好的文档记录,并且确实指定了您的实现
  • 这些课程本身是公开的
。。。。然后我会使用
私有保护
;-)

这是关于天气的。更具体:继承和多个程序集。考虑以下事项:

对于正常的
受保护的
(随
专用
一起解释):


现在,
私有保护
的区别在于,它必须位于同一程序集中才能访问:

因此:

有效,但仅当
A
Base
都在同一程序集/dll/exe等中编译时有效


现在,既然清楚了,你什么时候会使用真正的受私人保护的

关于这一点可以说很多。一些人(包括我)会认为使用私有保护的
是一种反模式,因为在我的观点中,它与。我必须说的是,尽管与《朋友》(friend)相反,《私人保护》(private protected)将“污垢”隔离,但它仍然是任意行为、逻辑,取决于其定义的位置

话虽如此,问题仍然存在,何时使用它。你可能会惊讶于我曾经准时使用过它,而且它非常有用

考虑以下情况:

  • 具有概念性的、装饰模式样式化的代码库,例如一些
    图形对象
    系统
  • 所有对象都将以各种方式“可渲染”
  • 因为您有很多,所以创建一个仅为方便而使用的基类非常方便
  • 您不希望让其他用户使用此功能,因为它没有很好的文档记录,并且确实指定了您的实现
  • 这些课程本身是公开的

。。。。然后我会使用
私有保护
;-)

Private protected意味着只允许在同一程序集中的派生类(子类)中使用基类的受保护成员变量(同一个dot-net dll)

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

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


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

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

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

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


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

我想您弄错了我的问题。。它的protected vs private protected,not protected vs private.Oh,lol,my bad:-)我的理解是,对于protected,受保护的成员可以在其类内通过派生类实例访问,而不管程序集如何,而对于Private protected-Private protected成员可由从包含类派生的类型访问,但只能在其包含程序集中访问。如果我错了,请纠正我。是的,你是对的。谢谢Stefan。谢谢你的支持。我想你把我的问题搞错了。。它的protected vs private protected,not protected vs private.Oh,lol,my bad:-)我的理解是,对于protected,受保护的成员可以在其类内通过派生类实例访问,而不管程序集如何,而对于Private protected-Private protected成员可由从包含类派生的类型访问,但只能在其包含程序集中访问。如果我是w,请纠正我
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.
    }
}
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
    }
}