Der Dateimodifizierer
Ab C# 11 ist das kontextbezogene Schlüsselwort file
ein Typmodifizierer.
Der file
Modifizierer schränkt die Sichtbarkeit eines Typs der obersten Ebene auf die Datei ein, in der er deklariert wird. Der file
Modifizierer wird am häufigsten auf Typen angewendet, die von einem Quellgenerator geschrieben wurden. Dateilokale Typen bieten Quellgeneratoren eine praktische Möglichkeit, um Namenskonflikte zwischen generierten Typen zu vermeiden. Der file
Modifizierer deklariert einen dateilokalen Typ, wie im folgenden Beispiel gezeigt:
file class HiddenWidget
{
// implementation
}
Alle Typen, die in einem dateilokalen Typ geschachtelt sind, sind ebenfalls nur innerhalb der Datei sichtbar, in der sie deklariert sind. Andere Typen in einer Assembly können denselben Namen wie ein dateilokaler Typ verwenden. Da der dateilokale Typ nur in der Datei sichtbar ist, in der er deklariert ist, verursachen diese Typen keine Namenskonflikte.
Ein dateilokaler Typ kann nicht der Rückgabetyp oder Parametertyp eines Elements sein, das in einem nicht dateilokalen Typ deklariert ist. Ein dateilokaler Typ kann kein Feldmitglied eines nicht dateilokalen Typs sein. Ein sichtbarerer Typ kann jedoch implizit einen dateilokalen Schnittstellentyp implementieren. Der Typ kann auch explicitly implement eine dateilokale Schnittstelle, aber explizite Implementierungen können nur innerhalb der gleichen Datei verwendet werden.
Das folgende Beispiel zeigt einen öffentlichen Typ, der einen dateilokalen Typ verwendet, um eine Workermethode bereitzustellen. Darüber hinaus implementiert der öffentliche Typ implizit eine dateilokale Schnittstelle:
// In File1.cs:
file interface IWidget
{
int ProvideAnswer();
}
file class HiddenWidget
{
public int Work() => 42;
}
public class Widget : IWidget
{
public int ProvideAnswer()
{
var worker = new HiddenWidget();
return worker.Work();
}
}
In einer anderen Quelldatei können Sie Typen deklarieren, die dieselben Namen wie die dateilokalen Typen aufweisen. Die dateilokalen Typen sind nicht sichtbar:
// In File2.cs:
// Doesn't conflict with HiddenWidget
// declared in File1.cs
public class HiddenWidget
{
public void RunTask()
{
// omitted
}
}
Member lookup bevorzugt einen dateilokalen Typ, der in der gleichen Datei deklariert ist, gegenüber einem nicht-dateilokalen Typ, der in einer anderen Datei deklariert ist. Diese Regel stellt sicher, dass ein Quellgenerator sich darauf verlassen kann, dass die Member-Lookup-Funktion einen dateilokalen Typ auflöst, ohne dass es zu Mehrdeutigkeiten mit anderen Typdeklarationen kommt. Im vorangegangenen Beispiel werden alle Verwendungen von HiddenWidget
in File1.cs wird in den dateilokalen Typ aufgelöst, der in File1.cs. Die dateilokale Deklaration von HiddenWidget
versteckt die öffentliche Erklärung in File2.cs.
C#-Sprachspezifikation
Weitere Informationen finden Sie unter Deklarierte Barrierefreiheit in der C#-Sprachspezifikation und in der Featurespezifikation C# 11: Lokale Dateitypen.