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.
Défi
FacileConstruisons 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 classePhysicsConstantsdans l'espace de nomsSimulation. Cette classe doit contenir des constantes universelles qui ne changent jamais et sont les mêmes partout :- Un champ
constGravitydéfini sur9.81 - Un champ
constSpeedOfLightdéfini sur299792458 - Une chaîne
constGravityUnitdéfinie sur"m/s^2"
- Un champ
Projectile.cs: Définissez une classeProjectiledans l'espace de nomsSimulation. 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
readonlyName(string) - Un champ
readonlyInitialVelocity(double) - Un champ
readonlyLaunchAngle(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). UtilisezMath.Sin()et convertissez les degrés en radians en multipliant parMath.PI / 180
- Un champ
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} mArrondissez 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 mAide-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)
}
}
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
1Fondamentaux de la POO
Fichiers externesEspaces de noms et directivesIntro aux classes et objetsLe mot-clé 'this'Méthodes et paramètresChamps vs PropriétésConstructeursInitialiseurs d'objetsRécapitulatif - Calculatrice simple4Héritage
Syntaxe de base de l'héritage (:)Le mot-clé 'base'Mots-clés Virtual & OverrideClasses scelléesLa classe de base 'object'Récapitulatif - Hiérarchie des employés7Fonctionnalités avancées
Surcharge d'opérateursIndexeurs (this[])Redéfinition de ToString()Méthodes d'extensionRécapitulatif - Liste personnalisée10Patrons de conception - Partie 1
Introduction aux patrons de conceptionSingleton Thread-SafePatron FabriquePatron Observateur (Événements)Patron Stratégie2Propriétés et membres statiques
Propriétés auto-implémentéesPropriétés en lecture/écriture seuleChamps et méthodes statiquesClasses statiquesMembres à corps d'expression5Polymorphisme & Interfaces
Polymorphisme : Compilation vs ExécutionInterface vs Classe AbstraiteInterfaces MultiplesInterfaces ExplicitesUpcasting & DowncastingRécapitulatif - Calculateur de Formes8Concepts avancés de la POO
Composition plutôt qu'héritageGénériques (Classes et Méthodes)Délégués et ÉvénementsAttributs et RéflexionIDisposable et l'instruction usingBases de l'Injection de Dépendances11Patrons de conception, Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode TemplatePatron ÉtatPatron Composite3Architecture des classes
Données d'instance vs statiquesMots-clés 'readonly' & 'const'Champs de supportRécapitulatif - Gestionnaire de compte bancaire6Encapsulation
Modificateurs d'accèsPropriétés pour l'encapsulationImplémentation du masquage de donnéesPatterns d'immuabilitéRécapitulatif - Dossiers d'étudiants12Projet : Système de gestion de bibliothèque
Structure du projetModèles Livre et Utilisateur