受保护的内部成员(C# 参考)

protected internal关键字组合是成员访问修饰符。 可从当前程序集或派生自包含类的类型访问受保护的内部成员。 有关与其他访问修饰符的 protected internal 比较,请参阅 访问级别

示例:

可从包含程序集内的任何类型访问基类的受保护的内部成员。 也可在另一程序集中的派生类中访问它,前提是通过派生类类型的变量进行访问。 例如,请考虑以下代码段:

// Assembly1.cs
// Compile with: /target:library
public class BaseClass
{
   protected internal int myValue = 0;
}

class TestAccess
{
    void Access()
    {
        var baseObject = new BaseClass();
        baseObject.myValue = 5;
    }
}
// Assembly2.cs
// Compile with: /reference:Assembly1.dll
class DerivedClass : BaseClass
{
    static void Main()
    {
        var baseObject = new BaseClass();
        var derivedObject = new DerivedClass();

        // Error CS1540, because myValue can only be accessed by
        // classes derived from BaseClass.
        // baseObject.myValue = 10;

        // OK, because this class derives from BaseClass.
        derivedObject.myValue = 10;
    }
}

此示例包含两个文件, Assembly1.cs 以及 Assembly2.cs. 第一个文件包含公共基类, BaseClass另一个类 TestAccessBaseClass 拥有一个受保护的内部成员 myValue,该成员由 TestAccess 类型访问,因为它们位于同一程序集。 第二个文件中,尝试通过实例myValue进行访问BaseClass将产生错误,而通过派生类DerivedClass的实例访问此成员将成功。 这表明, protected internal 允许从 同一程序集中的任何类任何程序集中的派生类进行访问,使其成为受保护访问修饰符最宽松的访问修饰符。

结构成员不能 protected internal 是因为无法继承结构。

替代受保护的内部成员

替代虚拟成员时,被替代方法的辅助功能修饰符取决于定义派生类的程序集。

在与基类相同的程序集中定义派生类时,所有被替代成员具有 protected internal 访问权限。 如果派生类是在基类的不同程序集中定义的,则被替代成员具有 protected 访问权限。

// Assembly1.cs
// Compile with: /target:library
public class BaseClass
{
    protected internal virtual int GetExampleValue()
    {
        return 5;
    }
}

public class DerivedClassSameAssembly : BaseClass
{
    // Override to return a different example value, accessibility modifiers remain the same.
    protected internal override int GetExampleValue()
    {
        return 9;
    }
}
// Assembly2.cs
// Compile with: /reference:Assembly1.dll
class DerivedClassDifferentAssembly : BaseClass
{
    // Override to return a different example value, since this override
    // method is defined in another assembly, the accessibility modifiers
    // are only protected, instead of protected internal.
    protected override int GetExampleValue()
    {
        return 2;
    }
}

C# 语言规范

有关详细信息,请参阅 C# 语言规范。 语言规范是 C# 语法和用法的明确来源。

另请参阅