private protected(C# 参考)

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 拥有一个私有受保护成员,即 myValueDerivedClass1 可以在同一程序集内以继承成员形式访问此私有受保护成员。

在第二个文件中,尝试将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# 语法和用法的明确来源。

另请参阅