Menu
Coddy logo textTech

Mots-clés 'readonly' & 'const'

Fait partie de la section Programmation Orientée Objet du Journey C# de Coddy — leçon 16 sur 70.

C# fournit deux mots-clés pour créer des valeurs qui ne peuvent pas changer : const et readonly. Bien que les deux empêchent la modification, ils fonctionnent différemment et servent des objectifs distincts.

Un champ const doit être assigné lors de la déclaration et sa valeur est déterminée au moment de la compilation. Il est implicitement statique, ce qui signifie qu'il appartient à la classe plutôt qu'aux instances :

public class GameSettings
{
    public const int MaxPlayers = 4;
    public const double Gravity = 9.81;
}

Vous accédez aux constantes via le nom de la classe : GameSettings.MaxPlayers. Les constantes ne fonctionnent qu'avec les types primitifs, les chaînes de caractères et null car le compilateur doit connaître la valeur exacte.

Un champ readonly peut être assigné lors de la déclaration ou dans un constructeur, et sa valeur est déterminée au moment de l'exécution :

public class Player
{
    public readonly string Id;
    public readonly DateTime CreatedAt = DateTime.Now;
    
    public Player(string id)
    {
        Id = id;
    }
}

Contrairement à const, les champs readonly peuvent contenir n'importe quel type et peuvent avoir des valeurs différentes par instance. Une fois que le constructeur est terminé, la valeur ne peut pas changer.

Utilisez const pour les valeurs qui sont véritablement universelles et ne changeront jamais, comme les constantes mathématiques. Utilisez readonly pour les valeurs qui doivent être définies une seule fois mais qui peuvent varier d'un objet à l'autre ou nécessiter un calcul au moment de l'exécution.

challenge icon

Défi

Facile

Construisons un système de configuration de simulation physique qui démontre quand utiliser const pour les constantes universelles par rapport à readonly pour les valeurs qui sont définies une seule fois au moment de l'exécution.

Vous allez créer deux fichiers pour organiser votre code :

  • PhysicsConstants.cs : Définissez une classe PhysicsConstants dans l'espace de noms Simulation. Cette classe doit contenir des constantes universelles qui ne changent jamais et sont les mêmes partout :
    • Un champ const Gravity défini sur 9.81
    • Un champ const SpeedOfLight défini sur 299792458
    • Une chaîne const GravityUnit définie sur "m/s^2"
  • Projectile.cs : Définissez une classe Projectile dans l'espace de noms Simulation. Chaque projectile possède des valeurs qui doivent être définies une seule fois lors de sa création et ne plus jamais être modifiées par la suite :
    • Un champ readonly Name (string)
    • Un champ readonly InitialVelocity (double)
    • Un champ readonly LaunchAngle (double, en degrés)
    • Un constructeur qui accepte et définit ces trois valeurs
    • Une méthode GetMaxHeight() qui calcule la hauteur maximale en utilisant la formule : (velocity^2 * sin^2(angle)) / (2 * gravity). Utilisez Math.Sin() et convertissez les degrés en radians en multipliant par Math.PI / 180
  • Program.cs : Dans votre fichier principal, créez un projectile en utilisant les valeurs d'entrée et affichez les constantes physiques ainsi que la hauteur maximale calculée du projectile.

Vous recevrez trois entrées :

  • Nom du projectile
  • Vitesse initiale (en m/s)
  • Angle de lancement (en degrés)

Affichez la sortie dans ce format :

Gravity: {Gravity} {GravityUnit}
Speed of Light: {SpeedOfLight} m/s
Projectile: {Name}
Initial Velocity: {InitialVelocity} m/s
Launch Angle: {LaunchAngle} degrees
Max Height: {maxHeight} m

Arrondissez la hauteur maximale à 2 décimales en utilisant Math.Round(value, 2).

Par exemple, si les entrées sont Rocket, 50, et 45, la sortie devrait être :

Gravity: 9.81 m/s^2
Speed of Light: 299792458 m/s
Projectile: Rocket
Initial Velocity: 50 m/s
Launch Angle: 45 degrees
Max Height: 63.71 m

Aide-mémoire

C# fournit deux mots-clés pour créer des valeurs immuables : const et readonly.

Un champ const doit être assigné lors de la déclaration, est déterminé au moment de la compilation et est implicitement statique :

public class GameSettings
{
    public const int MaxPlayers = 4;
    public const double Gravity = 9.81;
}

Accédez aux constantes via le nom de la classe : GameSettings.MaxPlayers. Les constantes ne fonctionnent qu'avec les types primitifs, les chaînes de caractères et null.

Un champ readonly peut être assigné lors de la déclaration ou dans un constructeur, et sa valeur est déterminée au moment de l'exécution :

public class Player
{
    public readonly string Id;
    public readonly DateTime CreatedAt = DateTime.Now;
    
    public Player(string id)
    {
        Id = id;
    }
}

Les champs readonly peuvent contenir n'importe quel type et peuvent avoir des valeurs différentes par instance. Une fois que le constructeur est terminé, la valeur ne peut plus changer.

Utilisez const pour les valeurs universelles qui ne changeront jamais. Utilisez readonly pour les valeurs qui doivent être définies une seule fois mais qui peuvent varier d'un objet à l'autre ou nécessiter un calcul au moment de l'exécution.

Essayez vous-même

using System;
using Simulation;

class Program
{
    public static void Main(string[] args)
    {
        // Lire les entrées
        string name = Console.ReadLine();
        double velocity = Convert.ToDouble(Console.ReadLine());
        double angle = Convert.ToDouble(Console.ReadLine());

        // TODO: Créer un objet Projectile avec les valeurs d'entrée

        // TODO: Afficher les constantes physiques (Gravity avec l'unité, Speed of Light)

        // TODO: Afficher les informations du projectile (Name, Initial Velocity, Launch Angle)

        // TODO: Calculer et afficher la hauteur maximale (arrondie à 2 décimales)
    }
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Programmation Orientée Objet