arquivo (referência de C#)

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

O modificador file restringe o escopo e a visibilidade de um tipo de nível superior ao arquivo no qual ele é declarado. O modificador file geralmente será aplicado a tipos gravados por um gerador de origem. 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 de 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 nem o tipo de parâmetro de qualquer membro mais visível do que o escopo file. Um tipo local de arquivo não pode ser um membro de campo de um tipo que tenha maior visibilidade do que o escopo file. No entanto, um tipo mais visível pode implementar implicitamente um tipo de interface local de arquivo. O tipo também pode implementar explicitamente uma interface local do arquivo, mas implementações explícitas só podem ser usadas dentro do escopo file.

Exemplo

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 de 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 são visíveis:

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

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.

Confira também