private protected
关键字组合是成员访问修饰符。 仅派生自包含类的类型可访问私有受保护成员,但仅能在其包含程序集中访问。 有关与其他访问修饰符的 private protected
比较,请参阅 访问级别。
注释
private protected
访问修饰符在 C# 版本 7.2 及更高版本中有效。
示例:
仅当变量的静态类型是派生类类型时,可从派生的类型访问基类的私有受保护成员(在其包含程序集中访问)。 例如,请考虑以下代码段:
// Assembly1.cs
// Compile with: /target:library
public class BaseClass
{
private protected int myValue = 0;
}
public class DerivedClass1 : BaseClass
{
void Access()
{
var baseObject = new BaseClass();
// Error CS1540, because myValue can only be accessed by
// classes derived from BaseClass.
// baseObject.myValue = 5;
// OK, accessed through the current derived class instance
myValue = 5;
}
}
// Assembly2.cs
// Compile with: /reference:Assembly1.dll
class DerivedClass2 : BaseClass
{
void Access()
{
// Error CS0122, because myValue can only be
// accessed by types in Assembly1
// myValue = 10;
}
}
此示例包含两个文件, Assembly1.cs
以及 Assembly2.cs
.
第一个文件包含公共基类, BaseClass
以及派生自它的 DerivedClass1
类型。
BaseClass
拥有一个私有受保护成员,即 myValue
,DerivedClass1
可以在同一程序集内以继承成员形式访问此私有受保护成员。
在第二个文件中,尝试将myValue
作为DerivedClass2
的继承成员进行访问将产生错误,因为private protected
成员只能由同一程序集中的派生类型访问。 这是与protected
(允许从任何程序集中的派生类进行访问)和protected internal
(允许从同一程序集中的任何类或任何程序集中的派生类进行访问)的关键区别。
如果 Assembly1.cs
中包含一个将 InternalsVisibleToAttribute 命名为 Assembly2
的元素,则派生类 DerivedClass2
将能够访问在 private protected
中声明的 BaseClass
成员。
InternalsVisibleTo
使 private protected
成员对其他程序集中的派生类可见。
与其他受保护的访问修饰符的比较
下表总结了三个受保护访问修饰符之间的主要差异:
访问修饰符 | 相同程序集,派生类 | 相同程序集,非派生类 | 不同程序集,派生类 |
---|---|---|---|
protected |
✔️ | ❌ | ✔️ |
protected internal |
✔️ | ✔️ | ✔️ |
private protected |
✔️ | ❌ | ❌ |
- 当你希望任何程序集中的派生类访问成员时,请使用
protected
- 当需要最宽松的访问时使用
protected internal
(同一程序集或派生类中的任何类在任何位置) - 当需要最高限制的保护访问权限时,使用
private protected
(仅适用于同一程序集中的派生类)
结构成员不能 private protected
是因为无法继承结构。
C# 语言规范
有关详细信息,请参阅 C# 语言规范。 语言规范是 C# 语法和用法的明确来源。