Partage via


Champs (Guide de programmation C#)

Un champ est une variable de tout type qui est déclarée directement dans une classe ou un struct. Les champs sont membres de leur type contenant.

Les classes et les structs peuvent avoir des champs d’instance, des champs statiques, ou les deux. Les champs d’instance sont spécifiques à une instance de type. Si vous avez une classe T avec un champ d’instance F, vous pouvez créer deux objets de typeT et modifier la valeur de F dans chaque objet, sans affecter la valeur de l’autre objet. En revanche, un champ statique appartient au type, et il est partagé entre toutes les instances de ce type. Vous pouvez accéder au champ statique uniquement à l’aide du nom de type. Si vous accédez au champ statique par un nom d’instance, vous obtenez l’erreur de compilation CS0176 .

En règle générale, vous devez déclarer l’accessibilité à private ou protected pour les champs. Les données que votre type expose au code client doivent être fournies via des méthodes, des propriétés et des indexeurs. L’utilisation de ces constructions pour l’accès indirect aux champs internes permet d’éviter les valeurs d’entrée non valides. Un champ privé qui stocke les données exposées par une propriété publique est appelé magasin de stockage ou champ de stockage. Vous pouvez déclarer des champs public, mais vous ne pouvez pas empêcher le code qui utilise votre type de définir ce champ sur une valeur non valide ou modifier les données d’un objet.

En général, les champs stockent les données qui doivent être accessibles à plusieurs méthodes de type et doivent être stockées plus longtemps que la durée de vie d’une méthode. Par exemple, un type qui représente une date de calendrier peut avoir trois champs de type entier : un pour le mois, un pour le jour et un pour l’année. Les variables qui ne sont pas utilisées en dehors de la portée d’une seule méthode doivent être déclarées comme des variables locales dans le corps de la méthode.

Les champs sont déclarés dans le bloc Class ou Struct en spécifiant le niveau d’accès, suivi du type, puis du nom du champ. Par exemple :

public class CalendarEntry
{

    // private field (Located near wrapping "Date" property).
    private DateTime _date;

    // Public property exposes _date field safely.
    public DateTime Date
    {
        get
        {
            return _date;
        }
        set
        {
            // Set some reasonable boundaries for likely birth dates.
            if (value.Year > 1900 && value.Year <= DateTime.Today.Year)
            {
                _date = value;
            }
            else
            {
                throw new ArgumentOutOfRangeException("Date");
            }
        }
    }

    // public field (Generally not recommended).
    public string? Day;

    // Public method also exposes _date field safely.
    // Example call: birthday.SetDate("1975, 6, 30");
    public void SetDate(string dateString)
    {
        DateTime dt = Convert.ToDateTime(dateString);

        // Set some reasonable boundaries for likely birth dates.
        if (dt.Year > 1900 && dt.Year <= DateTime.Today.Year)
        {
            _date = dt;
        }
        else
        {
            throw new ArgumentOutOfRangeException("dateString");
        }
    }

    public TimeSpan GetTimeSpan(string dateString)
    {
        DateTime dt = Convert.ToDateTime(dateString);

        if (dt.Ticks < _date.Ticks)
        {
            return _date - dt;
        }
        else
        {
            throw new ArgumentOutOfRangeException("dateString");
        }
    }
}

Pour accéder à un champ dans une instance, ajoutez un point après le nom de l’objet, suivi du nom de l’instance, comme dans instancename._fieldName. Par exemple :

CalendarEntry birthday = new CalendarEntry();
birthday.Day = "Saturday";

Une valeur initiale peut être attribuée à un champ à l’aide de l’opérateur d’assignation, lorsque le champ est déclaré. Pour assigner automatiquement le champ Day à "Monday", par exemple, vous devez déclarer Day, comme dans l’exemple suivant :

public class CalendarDateWithInitialization
{
    public string Day = "Monday";
    //...
}

Les champs sont initialisés juste avant le constructeur pour l’instance d’objet qui est appelée. Si le constructeur assigne la valeur d’un champ, la valeur assignée pendant la déclaration du champ sera remplacée. Pour plus d’informations, consultez Utilisation de constructeurs.

Notes

Un initialiseur de champ ne peut pas référencer d’autres champs d’instance.

Les champs peuvent être marqués comme public, private, protected, internal, protected internal ou private protected. Ces modificateurs d’accès définissent comment les utilisateurs du type peuvent accéder aux champs. Pour plus d’informations, consultez Modificateurs d’accès.

Facultatif : vous pouvez déclarer un champ comme static. Les champs statiques sont accessibles à tout moment aux appelants, même s’il n’existe aucune instance du type. Pour plus d’informations, consultez la page Classes statiques et membres de classes statiques.

Un champ peut être déclaré readonly. Un champ en lecture seule ne peut recevoir de valeur que pendant l’initialisation ou dans un constructeur. Un champ static readonly est similaire à une constante, à ceci près que le compilateur C# n’a pas accès à la valeur d’un champ statique en lecture seule au moment de la compilation, mais seulement au moment de l’exécution. Pour plus d’informations, consultez Constantes.

Un champ peut être déclaré required. Un champ obligatoire doit être initialisé par le constructeur ou par un initialiseur d’objet lors de la création d’un objet. Vous ajoutez l’attribut System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute à n’importe quelle déclaration de constructeur qui initialise tous les membres requis.

Le modificateur required ne peut pas être combiné avec le modificateur readonly sur le même champ. Toutefois, la propriété peut être required et init uniquement.

À compter de C# 12, les paramètres du constructeur principal constituent une alternative à la déclaration de champs. Lorsque votre type a des dépendances qui doivent être fournies lors de l’initialisation, vous pouvez créer un constructeur principal qui fournit ces dépendances. Ces paramètres peuvent être capturés et utilisés à la place des champs déclarés dans vos types. Dans le cas des types record, les paramètres du constructeur principal sont exposés en tant que propriétés publiques.

spécification du langage C#

Pour plus d'informations, voir la spécification du langage C#. La spécification du langage est la source de référence pour la syntaxe C# et son utilisation.

Voir aussi