Compartir vía


Modificador de archivo

A partir de C# 11, la palabra clave contextual file es un modificador de tipo.

El modificador file restringe la visibilidad de un tipo de nivel superior al archivo en el que se declara. El modificador file se aplica con más frecuencia a los tipos escritos por un generador de origen. Los tipos locales de archivo proporcionan a los generadores de origen una manera cómoda de evitar conflictos de nombres entre los tipos generados. El modificador file declara un tipo local de archivo, como en este ejemplo:

file class HiddenWidget
{
    // implementation
}

Todos los tipos anidados dentro de un tipo local de archivo también son visibles solo dentro del archivo en el que se declara. Otros tipos de un ensamblado pueden usar el mismo nombre que un tipo local de archivo. Dado que el tipo local de archivo solo está visible en el archivo donde se declara, estos tipos no crean una colisión de nomenclatura.

Un tipo local de archivo no puede ser el tipo de valor devuelto ni el tipo de parámetro de ningún miembro declarado en un tipo no local de archivo. Un tipo de archivo local no puede ser un miembro de campo de un tipo que no sea de archivo local. Sin embargo, un tipo más visible puede implementar implícitamente un tipo de interfaz local de archivo. El tipo también puede implementar explícitamente una interfaz local de archivo, pero solo se pueden usar implementaciones explícitas dentro del mismo archivo.

En el ejemplo siguiente se muestra un tipo público que usa un tipo local de archivo para proporcionar un método de trabajo. Además, el tipo público implementa implícitamente una interfaz local de archivo:

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

En otro archivo de origen, puede declarar tipos que tengan los mismos nombres que los tipos locales de archivo. Los tipos locales de archivo no están visibles:

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

La búsqueda de miembros prefiere un tipo local de archivo declarado en el mismo archivo sobre un tipo no local de archivo declarado en otro archivo. Esta regla garantiza que un generador de origen pueda confiar en la búsqueda de miembros que se resuelve en un tipo local de archivo sin ambigüedad con otras declaraciones de tipo. En el ejemplo anterior, todos los usos de HiddenWidget en File1.cs se resuelven en el tipo local de archivo declarado en File1.cs. La declaración local de archivo de HiddenWidget oculta la declaración pública en File2.cs.

Especificación del lenguaje C#

Para más información, consulte Accesibilidad declarada en la especificación del lenguaje C# y la especificación de características Tipos locales de archivo de C# 11.

Consulte también