受保护的内部成员(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
和另一个类 TestAccess
。 BaseClass
拥有受保护的内部成员 myValue
,由 TestAccess
类型访问。
在第二个文件中,如果尝试通过 BaseClass
的实例访问 myValue
,会生成错误,但如果尝试通过一个派生类的实例来访问此成员,DerivedClass
会成功。
结构成员不能为 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# 语法和用法的权威资料。