file (C#-Referenz)
Ab C# 11 ist das kontextbezogene Schlüsselwort file
ein Typmodifizierer.
Der file
-Modifizierer schränkt den Bereich und die Sichtbarkeit eines Typs der obersten Ebene auf die Datei ein, in der er deklariert ist. Der file
-Modifizierer wird in der Regel auf Typen angewendet, die von einem Quellgenerator geschrieben werden. Dateilokale Typen bieten Quellgeneratoren eine bequeme Möglichkeit, Namenskonflikte zwischen generierten Typen zu vermeiden. Der file
-Modifizierer deklariert einen dateilokalen Typ, wie in diesem Beispiel gezeigt:
file class HiddenWidget
{
// implementation
}
Alle Typen, die in einem dateilokalen Typ geschachtelt sind, sind auch nur in der Datei sichtbar, in der er deklariert ist. 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, führen diese Typen nicht zu einem Namenskonflikt.
Ein dateilokaler Typ kann nicht der Rückgabetyp oder Parametertyp eines Elements sein, dessen Sichtbarkeit über den file
-Bereich hinaus reicht. Ein dateilokaler Typ darf kein Feldmember eines Typs sein, dessen Sichtbarkeit über den file
-Bereich hinaus reicht. Ein Typ mit größerer Sichtbarkeit kann jedoch implizit einen dateilokalen Schnittstellentyp implementieren. Der Typ kann außerdem explizit eine dateilokale Schnittstelle implementieren, jedoch können explizite Implementierungen nur innerhalb des file
-Bereichs verwendet werden.
Beispiel
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 denselben Namen wie die dateilokalen Typen haben. 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
}
}
C#-Sprachspezifikation
Weitere Informationen finden Sie unter Deklarierte Barrierefreiheit in der C#-Sprachspezifikation und in der Featurespezifikation C# 11: Lokale Dateitypen.