internal (C# リファレンス)
internal キーワードは、型および型メンバーのためのアクセス修飾子です。 internal 型またはメンバーは、この例に示すように同じアセンブリのファイル内でのみアクセスできます。
public class BaseClass
{
// Only accessible within the same assembly
internal static int x = 0;
}
protected internal アクセス修飾子を持つ型やメンバーは、現在のアセンブリ、または包含クラスから派生した型からアクセスできます。
internal と他のアクセス修飾子の比較については、「アクセシビリティ レベル (C# リファレンス)」および「アクセス修飾子 (C# プログラミング ガイド)」を参照してください。
アセンブリの詳細については、「アセンブリとグローバル アセンブリ キャッシュ (C# および Visual Basic)」を参照してください。
内部アクセスは、コンポーネントのグループがアプリケーション コードの残りの部分には公開されないプライベートな手法で協調動作できるので、一般的にはコンポーネント ベースの開発に使用されます。 たとえば、グラフィカル ユーザー インターフェイスを構築するためのフレームワークでは、内部アクセスでメンバーを使用して協調動作する Control クラスと Form クラスを提供できます。 これらのメンバーは内部メンバーなので、フレームワークを使用するコードに対しては公開されません。
内部アクセスのメンバーまたは型を、メンバーまたは型が定義されているアセンブリの外側で参照するとエラーになります。
注意
internal virtual メソッドは、C# ではオーバーライドできませんが、言語によってはオーバーライドできる場合もあります。たとえば、Microsoft Intermediate Language (MSIL) でオーバーライドされる場合があります。
使用例
この例には、Assembly1.cs および Assembly1_a.cs という 2 つのファイルがあります。 1 つ目のファイルには、内部基本クラス BaseClass があります。 2 つ目のファイルでは、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 に変更します。 この場合、クラスをインスタンス化できますが、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# 言語仕様」を参照してください。 言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。