internal (C#-Referenz)
Bei dem internal-Schlüsselwort handelt es sich um einen Zugriffsmodifizierer für Typen und Typmember. Auf interne Typen oder Member kann nur in Dateien derselben Assembly zugegriffen werden, wie dieses Beispiel zeigt:
public class BaseClass
{
// Only accessible within the same assembly
internal static int x = 0;
}
Auf Typen oder Member, die über protected internal-Zugriffsmodifizierer verfügen, kann von der aktuellen Assembly oder von den Typen zugegriffen werden, die von der enthaltenden Klasse abgeleitet werden.
Einen Vergleich von internal mit den anderen Zugriffsmodifizierern finden Sie unter Zugriffsebenen (C#-Referenz) und Zugriffsmodifizierer (C#-Programmierhandbuch).
Weitere Informationen zu Assemblys finden Sie unter Assemblys und der globale Assemblycache (C# und Visual Basic).
Der interne Zugriff wird häufig in komponentenbasierter Entwicklung verwendet, da er einer Gruppe von Komponenten ermöglicht, in einer nicht öffentlichen Weise zusammenzuwirken, ohne dem Rest des Anwendungscodes zugänglich zu sein. Ein Framework zum Erstellen von grafischen Benutzeroberflächen kann beispielsweise die Control-Klasse und die Form-Klasse bereitstellen, die unter Verwendung von Membern mit internem Zugriff zusammenwirken. Da es sich bei diesen Membern um interne Elemente handelt, sind sie nicht dem Code, der das Gerüst verwendet, zugänglich gemacht worden.
Außerhalb der Assembly, in der ein Typ oder Member mit internem Zugriff definiert wurde, darf nicht auf diesen verwiesen werden.
Tipp
Eine internal virtual-Methode kann in einigen Sprachen, z. B. textbasierte MSIL (Microsoft Intermediate Language), mit Ilasm.exe überschrieben werden, selbst dann, wenn sie mit C# nicht überschrieben werden kann.
Beispiel
In diesem Beispiel sind zwei Dateien enthalten, Assembly1.cs und Assembly1_a.cs. Die erste Datei weist eine interne Basisklasse auf, BaseClass. In der zweiten Datei erzeugt ein Versuch, BaseClass zu instanziieren, einen Fehler.
// 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
}
}
Verwenden Sie in diesem Beispiel dieselben Dateien wie in Beispiel 1, und ändern Sie die Zugriffsebene von BaseClass in public. Ändern Sie außerdem die Zugriffsebene des Members IntM auf internal. In diesem Fall können Sie die Klasse instanziieren, aber Sie können nicht auf den internen Member zugreifen.
// 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#-Programmiersprachenspezifikation
Weitere Informationen finden Sie in der C#-Sprachspezifikation. Die Sprachspezifikation ist die verbindliche Quelle für die Syntax und Verwendung von C#.
Siehe auch
Referenz
Zugriffsmodifizierer (C#-Referenz)