Compartilhar via


O modificador de arquivo

A partir do C# 11, a palavra-chave contextual file é um modificador de tipo.

O modificador file restringe a visibilidade de um tipo de nível superior ao arquivo no qual ele é declarado. O modificador file geralmente é aplicado a tipos gerados por um gerador de código-fonte. Os tipos locais de arquivo fornecem aos geradores de origem uma maneira conveniente de evitar colisões de nome entre os tipos gerados. O modificador file declara um tipo local de arquivo, como neste exemplo:

file class HiddenWidget
{
    // implementation
}

Todos os tipos aninhados em um tipo local de arquivo também só são visíveis dentro do arquivo no qual são declarados. Outros tipos em um assembly podem usar o mesmo nome que um tipo local de arquivo. Como o tipo local do arquivo é visível apenas no arquivo em que é declarado, esses tipos não criam uma colisão de nomenclatura.

Um tipo local de arquivo não pode ser o tipo de retorno ou o tipo de parâmetro de qualquer membro declarado em um tipo não local de arquivo. Um tipo de arquivo local não pode ser um membro de campo de um não local de arquivo. No entanto, um tipo mais visível pode implementar implicitamente um tipo de interface local do arquivo. O tipo também pode implementar explicitamente uma interface local do arquivo, mas implementações explícitas só podem ser usadas dentro do mesmo arquivo.

O exemplo a seguir mostra um tipo público que usa um tipo local de arquivo para fornecer um método de trabalho. Além disso, o tipo público implementa uma interface local do arquivo implicitamente:

// 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();
    }
}

Em outro arquivo de origem, você pode declarar tipos que têm os mesmos nomes que os tipos locais de arquivo. Os tipos locais de arquivo não estão visíveis:

// In File2.cs:
// Doesn't conflict with HiddenWidget
// declared in File1.cs
public class HiddenWidget
{
    public void RunTask()
    {
        // omitted
    }
}

A pesquisa de membro prefere um tipo local de arquivo declarado no mesmo arquivo em vez de um tipo não local de arquivo declarado em um arquivo diferente. Essa regra garante que um gerador de origem possa contar com a resolução de pesquisa de membro para um tipo local de arquivo sem ambiguidade com outras declarações de tipo. No exemplo anterior, todos os usos de HiddenWidget em File1.cs são resolvidos para o tipo local de arquivo declarado em File1.cs. A declaração local do arquivo de HiddenWidget oculta a declaração pública em File2.cs.

Especificação da linguagem C#

Para obter mais informações, confira Acessibilidade declarada na Especificação de Linguagem C# e especificação do recurso C# 11 – Tipos locais de arquivo.

Consulte também