关键字 internal 是类型和类型成员 的访问修饰符 。
C# 语言参考记录了 C# 语言的最新发布版本。 它还包含即将发布的语言版本公共预览版中功能的初始文档。
本文档标识了在语言的最后三个版本或当前公共预览版中首次引入的任何功能。
小窍门
若要查找 C# 中首次引入功能时,请参阅 有关 C# 语言版本历史记录的文章。
注释
本文介绍 internal 访问权限。 关键字 internal 也是访问修饰符的 protected internal 一部分。
只能在同一 程序集中的文件中访问内部类型或成员,如以下示例所示:
public class BaseClass
{
// Only accessible within the same assembly.
internal static int x = 0;
}
有关与其他访问修饰符的 internal 比较,请参阅 辅助功能级别 和 访问修饰符。
An assembly 是从编译一个或多个源文件生成的可执行文件或动态链接库(DLL)。
有关程序集的详细信息,请参阅 .NET 中的程序集。
内部访问的常见用途是在基于组件的开发中,因为它使一组组件能够以私有方式合作,而无需向应用程序代码的其余部分公开。 例如,用于生成图形用户界面的框架可以提供 Control 和 Form 使用具有内部访问权限的成员合作的类。 由于这些成员是内部成员,因此不会向使用该框架的代码公开这些成员。
在定义类型或成员的程序集外部引用具有内部访问权限的类型或成员是错误的。
例子
此示例包含两个文件, Assembly1.cs 以及 Assembly1_a.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()
{
var myBase = new BaseClass(); // CS0122
}
}
在此示例中,使用在第一个示例中使用的相同文件,但将辅助功能级别 BaseClass 更改为 public。 此外,将成员 intM 的辅助功能级别更改为 internal。 在这种情况下,可以实例化该类,但无法访问内部成员。
// Assembly2.cs
// Compile with: /target:library
public class BaseClass
{
internal static int intM = 0;
}
// Assembly2_a.cs
// Compile with: /reference:Assembly2.dll
public class TestAccess
{
static void Main()
{
var myBase = new BaseClass(); // Ok.
BaseClass.intM = 444; // CS0117
}
}
C# 语言规范
有关详细信息,请参阅 C# 语言规范中的声明的可访问性。 语言规范是 C# 语法和用法的明确来源。