Модификатор файла
Начиная с C# 11, file
контекстное ключевое слово является модификатором типа.
Модификатор file
ограничивает видимость типа верхнего уровня в файле, в котором он объявлен. Модификатор file
чаще всего применяется к типам, написанным генератором источника. Типы, локальные в файлах, предоставляют генераторам исходного кода удобный способ избежать конфликтов имен среди создаваемых типов. Модификатор file
объявляет локальный тип файла, как в следующем примере:
file class HiddenWidget
{
// implementation
}
Все типы, вложенные в локальный тип файла, также отображаются только в файле, в котором он объявлен. Другие типы в сборке могут использовать то же имя, что и локальный тип файла. Поскольку тип, специфичный для файла, виден только в том файле, в котором он объявлен, эти типы не создают конфликта имен.
Файловый локальный тип не может быть возвращаемым или параметрическим типом любого члена, объявленного в не файловом локальном типе. Локальный для файла тип не может быть полем в типе, который не является локальным для файла. Однако более видимый тип может неявно реализовать тип локального интерфейса файла. Тип также может явно реализовать локальном интерфейсе файла, но явные реализации можно использовать только в одном файле.
В следующем примере показан общедоступный тип, использующий локальный тип файла для предоставления рабочего метода. Кроме того, открытый тип реализует неявно локальный интерфейс файла:
// 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 File2.cs:
// Doesn't conflict with HiddenWidget
// declared in File1.cs
public class HiddenWidget
{
public void RunTask()
{
// omitted
}
}
Поиск членов предпочитает тип, локальный для файла, объявленный в том же файле, по сравнению с типом, не являющимся локальным для файла и объявленным в другом файле. Это правило гарантирует, что генератор кода может полагаться на разрешение типа, локального для файла, без неоднозначности с объявлениями других типов. В предыдущем примере все использования HiddenWidget
в File1.cs разрешились в локальный тип файла, объявленный в File1.cs. Файловое локальное объявление HiddenWidget
скрывает публичное объявление в File2.cs.
Спецификация языка C#
Для получения дополнительной информации см. объявленный доступ в спецификации языка C#, а также спецификацию функции локальные типы файлов C# 11.