protected internal关键字组合是成员访问修饰符。 可以从当前程序集或派生自包含类的类型访问受保护的内部成员。 有关与其他访问修饰符的 protected internal 比较,请参阅 访问级别。
C# 语言参考记录了 C# 语言的最新发布版本。 它还包含即将发布的语言版本公共预览版中功能的初始文档。
本文档标识了在语言的最后三个版本或当前公共预览版中首次引入的任何功能。
小窍门
若要查找 C# 中首次引入功能时,请参阅 有关 C# 语言版本历史记录的文章。
包含程序集中的任何类型都可以访问基类的受保护内部成员。 位于另一个程序集中的派生类只有在通过派生类类型的变量进行访问时,才能访问该成员。 例如,请考虑以下代码段:
// 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另一个类 TestAccess。
BaseClass 拥有受保护的内部成员, myValue类型 TestAccess 访问该成员,因为它们位于同一程序集中。
第二个文件中,尝试通过生成错误的实例BaseClass进行访问myValue,而通过派生类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# 语法和用法的明确来源。