更新:2007 年 11 月

internal 关键字是类型和类型成员的访问修饰符。只有在同一程序集的文件中,内部类型或成员才是可访问的,如下例所示:

 复制代码
public class BaseClass 
{
    // Only accessible within the same assembly
    internal static int x = 0;
}

有关 internal 与其他访问修饰符的比较,请参见可访问性级别(C# 参考)访问修饰符(C# 编程指南)

有关程序集的更多信息,请参见 程序集和全局程序集缓存(C# 编程指南)

内部访问通常用于基于组件的开发,因为它使一组组件能够以私有方式进行合作,而不必向应用程序代码的其余部分公开。例如,用于生成图形用户界面的框架可以提供 ControlForm 类,这两个类通过使用具有内部访问权限的成员进行合作。由于这些成员是内部的,它们不向正在使用框架的代码公开。

从定义具有内部访问能力的类型或成员的程序集外部引用该类型或成员是错误的。

说明:

尽管不能用 C# 重写 internalvirtual 方法,但可以用某些语言(如使用 Ilasm.exe 的文本 Microsoft 中间语言 (MSIL))重写此方法。

示例

该示例包含两个文件:Assembly1.csAssembly2.cs。第一个文件包含内部基类 BaseClass。在第二个文件中,实例化 BaseClass 的尝试将产生错误。

 复制代码
// Assembly1.cs
// Compile with: /target:library
internal class BaseClass 
{
   public static int intM = 0;
}
 复制代码
// Assembly1_a.cs
// Compile with: /reference:Assembly1.dll
class TestAccess 
{
   static void Main() 
   {
      BaseClass myBase = new BaseClass();   // CS0122
   }
}

在此示例中,使用与示例 1 中所用的文件相同的文件,并将 BaseClass 的可访问性级别更改为 public。还将成员 IntM 的可访问性级别更改为 internal。在此例中,您可以实例化类,但不能访问内部成员。

 复制代码
// Assembly2.cs
// Compile with: /target:library
public class BaseClass 
{
   internal static int intM = 0;
}
 复制代码
// Assembly2_a.cs
// Compile with: /reference:Assembly1.dll
public class TestAccess 
{
   static void Main() 
   {
      BaseClass myBase = new BaseClass();   // Ok.
      BaseClass.intM = 444;    // CS0117
   }
}

C# 语言规范

有关更多信息,请参见 C# 语言规范中的以下各章节:

  • 3.5.1 声明的可访问性

  • 3.5.4 可访问性约束

  • 10.3.5 访问修饰符

  • 10.3.8.2 声明的可访问性

请参见