Partilhar 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 é mais frequentemente aplicado a tipos escritos por um gerador de código-fonte. Os tipos de arquivos locais fornecem aos geradores de origem uma maneira conveniente de evitar colisões de nomes entre os tipos gerados. O modificador file declara um tipo de arquivo local, como neste exemplo:

file class HiddenWidget
{
    // implementation
}

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

Um tipo file-local não pode ser o tipo de retorno ou tipo de parâmetro de qualquer membro declarado num tipo não file-local. Um tipo de local de ficheiro não pode ser um membro de campo de um não local de ficheiro. No entanto, um tipo mais visível pode implementar implicitamente um tipo de interface arquivo-local. O tipo também pode implementar explicitamente uma interface de arquivo local, 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 ficheiro para fornecer um método de trabalho. Além disso, o tipo público implementa uma interface arquivo-local 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 de arquivo local. Os tipos de arquivo local 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 de arquivo local declarado no mesmo arquivo a um tipo não local de arquivo declarado em um arquivo diferente. Esta regra garante que um gerador de origem possa confiar na resolução de pesquisa de membros para um tipo de arquivo local sem ambiguidade com outras declarações de tipo. No exemplo anterior, todos os usos de HiddenWidget em File1.cs resolvem para o tipo de ficheiro-local declarado em File1.cs. A declaração de arquivo local de HiddenWidget oculta a declaração pública em File2.cs.

Especificação da linguagem C#

Para obter mais informações, consulte de acessibilidade declarada node especificação de linguagem C# e a especificação de recurso C# 11 - File local types.

Ver também