有人能解释一下c#中受保护的内部修饰符和受保护的内部修饰符的区别吗?看起来它们的行为是一样的。
当前回答
可以将protected internal看作是在同一个字段、属性或方法上应用两个访问修饰符(protected和internal)。
在现实世界中,想象一下我们为人们提供参观博物馆的特权:
城里的每个人都可以参观博物馆(内部)。 父母居住的城市以外的任何人都可以参观博物馆(受保护)。
我们可以这样把它们放在一起:
城内(内部)和城外(受保护)所有父母居住在这里的人都可以参观博物馆(受保护的内部)。
编程世界:
internal:该字段在程序集(项目)中的任何地方都可用。这就像说它在它的项目范围内是公共的(但不能在项目范围外访问,甚至不能被从该类继承的程序集之外的那些类访问)。该类型的每个实例都可以在该程序集(项目范围)中看到它。
Protected:仅仅意味着所有派生类都可以看到它(在程序集内部或外部)。例如,派生类可以使用:base.NameOfProtectedInternal查看其方法和构造函数内部的字段或方法。
所以,把这两个访问修饰符放在一起(protected internal),你就有了一些可以在项目内公开的东西,并且可以被那些在他们的作用域内继承了该类的人看到。
它们可以写在内部保护,并且不改变意思,但是方便写在内部保护。
其他回答
可以将protected internal看作是在同一个字段、属性或方法上应用两个访问修饰符(protected和internal)。
在现实世界中,想象一下我们为人们提供参观博物馆的特权:
城里的每个人都可以参观博物馆(内部)。 父母居住的城市以外的任何人都可以参观博物馆(受保护)。
我们可以这样把它们放在一起:
城内(内部)和城外(受保护)所有父母居住在这里的人都可以参观博物馆(受保护的内部)。
编程世界:
internal:该字段在程序集(项目)中的任何地方都可用。这就像说它在它的项目范围内是公共的(但不能在项目范围外访问,甚至不能被从该类继承的程序集之外的那些类访问)。该类型的每个实例都可以在该程序集(项目范围)中看到它。
Protected:仅仅意味着所有派生类都可以看到它(在程序集内部或外部)。例如,派生类可以使用:base.NameOfProtectedInternal查看其方法和构造函数内部的字段或方法。
所以,把这两个访问修饰符放在一起(protected internal),你就有了一些可以在项目内公开的东西,并且可以被那些在他们的作用域内继承了该类的人看到。
它们可以写在内部保护,并且不改变意思,但是方便写在内部保护。
public——声明为public的成员(函数和变量)可以从任何地方访问。
private -私有成员不能从类外部访问。这是成员的默认访问说明符,即如果你没有为成员(变量或函数)指定访问说明符,它将被认为是私有的。因此,string PhoneNumber;相当于私有字符串PhoneNumber。
protected -受保护的成员只能从子类访问。
internal -只能在同一个程序集中访问它。
protected internal -它可以在同一个程序集中访问,也可以在派生类中访问。
Protected:变量或方法只对子类可用(在任何程序集中)
受保护的内部:可用于任何程序集中的子类和同一程序集中的所有类
在理解“受保护的内部”访问器的作用域方面仍然存在很多困惑,尽管大多数人都正确地定义了该定义。这帮助我理解了“受保护的”和“受保护的内部”之间的混淆:
Public在集合内部和外部都是公共的(Public internal / Public external)
Protected实际上是在程序集内部和外部受到保护(Protected internal / Protected external)(不允许在顶级类上)
Private在程序集内部和外部都是私有的(Private internal / Private external)(不允许在顶级类上)
Internal在集合内部是公共的但在集合外部是不存在的比如private (public Internal / excluded external)
Protected internal在程序集内部实际上是公共的,但在程序集外部是受保护的(公共内部/受保护的外部) (不允许在顶级类)
如你所见,受保护的内部是一个非常奇怪的野兽。不直观。
这就引出了一个问题,为什么微软不创建一个(受保护的内部/排除的外部),或者我猜是某种“私人保护”或“内部保护”?哈哈看起来不完整?
更令人困惑的是,您可以在受保护的、内部的或私有类型中嵌套公共或受保护的内部嵌套成员。为什么要访问排除外部程序集访问的内部类中的嵌套“受保护内部”?
微软表示,这样的嵌套类型受到其父类型作用域的限制,但编译器并不是这么说的。您可以在内部类中编译受保护的内部程序,这应该将范围限制为程序集。
对我来说,这是一个不完整的设计。它们应该简化所有类型的范围,使系统清楚地考虑到继承,以及嵌套类型的安全性和层次结构。这将使对象的共享非常直观和细粒度,而不是基于不完整的作用域系统发现类型和成员的可访问性。
在实践中,关于方法:
Protected -继承类可访问,否则为私有。
内部-仅对程序集中的类是公共的,否则为私有的。
Protected internal -意味着Protected或internal -方法可以被继承的类和程序集中的任何类访问。
推荐文章
- 静态隐式运算符
- 不区分大小写列表搜索
- 'throw'和'throw new Exception()'的区别
- 不能在lambda表达式中使用ref或out参数
- c# int到字节[]
- 如何跟踪log4net问题
- 将WPF组合框绑定到自定义列表
- foreach vs somlist . foreach (){}
- 为什么try{…}最后{…}好;尝试{…} catch{}坏?
- c# 8用多种情况切换表达式,结果相同
- 在没有事件源注册的情况下写入Windows应用程序事件日志
- 并发HashSet<T>在。net框架?
- 从控制器内获得控制器和动作名称?
- _ViewStart的位置和方式。CSHTML布局文件链接?
- 新建T()