file (référence C#)

À compter de C# 11, le mot clé contextuel file est un modificateur de type.

Le modificateur file limite l’étendue et la visibilité d’un type de niveau supérieur au fichier dans lequel il est déclaré. Le modificateur file est généralement appliqué aux types écrits par un générateur de sources. Les types locaux de fichiers fournissent aux générateurs de sources un moyen pratique d’éviter les collisions de noms entre les types générés. Le modificateur file déclare un type local de fichier, comme dans cet exemple :

file class HiddenWidget
{
    // implementation
}

Tous les types imbriqués dans un type local de fichier sont également visibles uniquement dans le fichier dans lequel il est déclaré. D’autres types d’un assembly peuvent utiliser le même nom qu’un type local de fichier. Étant donné que le type local de fichier est visible uniquement dans le fichier où il est déclaré, ces types ne créent pas de collision de nommage.

Un type local de fichier ne peut pas être le type de retour ou le type de paramètre d’un membre qui est plus visible que l’étendue file. Un type local de fichier ne peut pas être un membre de champ d’un type dont la visibilité est supérieure à l’étendue file. Toutefois, un type plus visible peut implémenter implicitement un type d’interface locale de fichier. Le type peut également implémenter explicitement une interface locale de fichier, mais les implémentations explicites ne peuvent être utilisées que dans l’étendue file.

Exemple

L’exemple suivant montre un type public qui utilise un type de fichier local pour fournir une méthode Worker. En outre, le type public implémente implicitement une interface locale de fichier :

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

Dans un autre fichier source, vous pouvez déclarer des types qui ont les mêmes noms que les types locaux de fichier. Les types locaux de fichier ne sont pas visibles :

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

spécification du langage C#

Pour plus d’informations, consultez Accessibilité déclarée dans la spécification du langage C# et la spécification de fonctionnalité C# 11 - Types locaux de fichiers.

Voir aussi