Поделиться через


Модификатор файла

Модификатор 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# и спецификации функций локальных типов файлов .

См. также