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# 语法和用法的明确来源。