有人可以详细说明C#中'protected'和'protected internal'修饰符之间的区别吗? 看起来他们的行为方式相同。
答案 0 :(得分:369)
“受保护的内部”访问修饰符是“受保护”和“内部”修饰符的联合。
来自MSDN, Access Modifiers (C# Programming Guide):
<强> protected 强>:
只能通过同一类中的代码访问类型或成员 struct,或在从该类派生的类中。
<强> internal 强>:
同一程序集中的任何代码都可以访问类型或成员, 但不是来自另一个集会。
受保护的内部:
可以通过程序集中的任何代码访问类型或成员 它在另一个派生类中声明为 OR 部件。来自另一个程序集的访问必须在一个类中进行 声明派生自受保护的类 内部元素被声明,它必须通过一个 派生类类型的实例。
请注意:protected internal
表示“protected
或internal
”(同一个程序集中的任何类,或任何派生类 - 即使它在一个不同的集会)。
......并且为了完整性:
<强> private 强>:
只能通过同一类中的代码访问类型或成员 结构
<强> public 强>:
类型或成员可以由同一个中的任何其他代码访问 装配或引用它的另一个装配。
<强> private protected 强>:
访问仅限于从中派生的包含类或类型 包含当前程序集中的类 (自C#7.2起可用)
答案 1 :(得分:83)
protected
。
protected internal
是protected
的所有内容,此外,同一程序集中的任何内容都可以访问它。
重要的是,它并不意味着“同一个程序集中的子类” - 它是两者的结合,而不是交集。
答案 2 :(得分:23)
在实践中,关于方法:
受保护 - 可以访问继承的类,否则是私有的。
内部 - 仅对程序集内的类公开,否则为private。
受保护的内部 - 表示受保护的或内部 - 对于程序集内任何类的继承类和,可以访问这些方法。
答案 3 :(得分:13)
答案 4 :(得分:9)
在理解保护内部&#34;的范围时仍然存在很多困惑。访问器,但大多数都正确定义了定义。这有助于我理解&#34; protected&#34;之间的混淆。和#34;受保护的内部&#34;:
公众在程序集内外非常公开(公共内部/公共外部)
受保护在程序集内外受到保护(受保护的内部/受保护外部)(顶级类不允许)
私有在程序集内外非常隐私(私有内部/私有外部)(顶级类不允许)
内部在程序集内部是公开的,但在私有(公共内部/排除外部)
之外被排除在程序集之外受保护的内部在程序集内部是公共的,但在程序集外部受到保护( public internal / protected external ) (不允许在顶级课程上)
正如您所见,受保护的内部是一个非常奇怪的野兽。不直观。
现在这就引出了一个问题:为什么微软没有创建(受保护的内部/被排除的外部),或者我认为某些&#34;私有保护&#34;或&#34;内部受保护&#34;?大声笑。似乎不完整?
令人困惑的是,您可以将公共或受保护的内部嵌套成员嵌套在受保护,内部或私有类型中。为什么要访问嵌套的#34;受保护的内部&#34;在排除外部程序集访问的内部类中?
微软称这种嵌套类型受其父类型范围的限制,但这并不是编译器所说的。您可以在内部类中编译受保护的内部,这应该将范围限制为仅仅是程序集。
对我来说,这感觉就像不完整的设计。它们应该将所有类型的范围简化为明确考虑继承的系统,以及嵌套类型的安全性和层次结构。这将使对象的共享非常直观和精细,而不是基于不完整的范围系统发现类型和成员的可访问性。答案 5 :(得分:7)
受保护:变量或方法仅适用于子类(在任何程序集中)
受保护的内部:可用于任何程序集和中的子类,可用于同一程序集中的所有类
答案 6 :(得分:3)
我已经读出了这些术语的非常明确的定义。
受保护:访问仅限于类定义和从类继承的任何类。只能通过同一个类或结构中的代码或从该类派生的类中访问类型或成员。
内部:访问仅限于当前项目程序集中定义的类。只能通过同一类中的代码访问类型或成员。
受保护的内部:访问仅限于当前程序集或从包含类派生的类型。
答案 7 :(得分:1)
公开 - 可以从任何地方访问声明为公开的成员(函数和变量)。
私人 - 无法从班级外访问私人会员。这是成员的默认访问说明符,即如果没有为成员(变量或函数)指定访问说明符,它将被视为私有。因此,字符串PhoneNumber;相当于私有字符串PhoneNumber。
受保护 - 只能从子类访问受保护的成员。
内部 - 只能在同一个程序集中访问它。
受保护的内部 - 可以在同一个程序集中以及派生类中访问它。
答案 8 :(得分:1)
受保护的会员
类的受保护成员仅在包含的类(已声明它)中以及在程序集内的派生类中以及程序集外部中可用。
表示驻留在程序集外部的类是否可以通过仅继承该类来使用其他程序集的受保护成员。
我们可以通过继承该类来暴露程序集外的受保护成员,并仅在派生类中使用它。
注意:使用派生类中的对象无法访问受保护的成员。
内部会员
类的内部成员在程序集中可用或访问创建对象或派生类,或者可以说它可以在程序集中的所有类中访问。
注意:使用对象创建或派生类无法在程序集外部访问内部成员。
受保护的内部
受保护的内部访问修饰符是受保护的或内部的组合。
受保护的内部成员可以在声明创建对象的整个程序集中使用,也可以通过继承该类来使用。并且只能在派生类中的程序集外部访问。
注意:受保护的内部成员在同一个程序集中作为内部工作,在程序集外部作为受保护的工作。
答案 9 :(得分:0)
当您希望在另一个程序集的派生类中同时使用成员或类型时,只需要使用成员或在父程序集中键入而不从声明它的类派生时,受保护的内部最佳套件。 此外,如果您只想使用不从另一个类派生的成员或类型,则在同一个程序集中,您只能使用内部。
答案 10 :(得分:0)
考虑将protected internal
应用于在相同的字段,属性或方法上使用两个访问修饰符(protected
和internal
)。
在现实世界中,想象一下我们正在授予人们参观博物馆的特权:
- 每个人内部都可以参观博物馆(内部)。
- 其父母居住的城市的所有人外部都可以参观博物馆(受保护)。
我们可以通过以下方式将它们放在一起:
父母(住在这里)的每个人(内部)(内部)和城市(外面)的所有人(内部)(受保护)都可以参观博物馆(<受保护的内部< / strong>)。
编程世界:
内部:该字段在程序集(项目)中的任何位置都可用。这就像说它在其项目范围内是public
(但即使是程序集外部从该类继承的那些类也不能在项目范围之外访问)。该类型的每个实例都可以在该程序集中(项目范围)看到它。
受保护的:仅表示所有派生类都可以看到它(在汇编内部或外部)。例如,派生类可以使用base.NameOfProtectedInternal
来查看其方法和构造函数中的字段或方法。
因此,将这两个访问修饰符放在一起( protected internal
),您可以在项目内部公开看到一些东西,并且可以被那些人看到在其作用域内从该类继承的。
可以将它们写成
internal protected
,并且不会改变含义,但是方便地写成protected internal
。