Parole chiave 'readonly' e 'const'
Fa parte della sezione Programmazione orientata agli oggetti del percorso C# di Coddy. Lezione 16 di 70.
C# offre due parole chiave per creare valori che non possono cambiare: const e readonly. Sebbene entrambe impediscano le modifiche, funzionano in modo diverso e hanno scopi distinti.
Un campo const deve essere assegnato al momento della dichiarazione e il suo valore è determinato in fase di compilazione. È implicitamente statico, il che significa che appartiene alla classe anziché alle istanze:
public class GameSettings
{
public const int MaxPlayers = 4;
public const double Gravity = 9.81;
}Accedi alle costanti tramite il nome della classe: GameSettings.MaxPlayers. Le costanti funzionano solo con tipi primitivi, stringhe e null perché il compilatore deve conoscere il valore esatto.
Un campo readonly può essere assegnato al momento della dichiarazione o in un costruttore, e il suo valore viene determinato in fase di esecuzione:
public class Player
{
public readonly string Id;
public readonly DateTime CreatedAt = DateTime.Now;
public Player(string id)
{
Id = id;
}
}A differenza di const, i campi readonly possono contenere qualsiasi tipo e avere valori diversi per ogni istanza. Una volta terminato il costruttore, il valore non può cambiare.
Usa const per valori davvero universali e che non cambieranno mai, come le costanti matematiche. Usa readonly per valori che dovrebbero essere impostati una sola volta, ma che potrebbero variare tra gli oggetti o richiedere un calcolo in fase di esecuzione.
Sfida
FacileCostruiamo un sistema di configurazione per una simulazione fisica che mostri quando usare const per le costanti universali e quando usare readonly per i valori impostati una sola volta durante l'esecuzione.
Creerai due file per organizzare il codice:
PhysicsConstants.cs: definisci una classePhysicsConstantsnello spazio dei nomiSimulation. Questa classe deve contenere costanti universali che non cambiano mai e sono uguali ovunque:- Un campo
constGravityimpostato su9.81 - Un campo
constSpeedOfLightimpostato su299792458 - Una stringa
constGravityUnitimpostata su"m/s^2"
- Un campo
Projectile.cs: definisci una classeProjectilenello spazio dei nomiSimulation. Ogni proiettile ha valori che devono essere impostati una sola volta al momento della creazione e non devono più essere modificati:- Un campo
readonlyName(stringa) - Un campo
readonlyInitialVelocity(double) - Un campo
readonlyLaunchAngle(double, in gradi) - Un costruttore che accetta e imposta tutti e tre i valori
- Un metodo
GetMaxHeight()che calcola l'altezza massima usando la formula:(velocity^2 * sin^2(angle)) / (2 * gravity). UsaMath.Sin()e converti i gradi in radianti moltiplicando perMath.PI / 180
- Un campo
Program.cs: nel file principale, crea un proiettile usando i valori di input e visualizza le costanti fisiche insieme all'altezza massima calcolata del proiettile.
Riceverai tre input:
- Nome del proiettile
- Velocità iniziale (in m/s)
- Angolo di lancio (in gradi)
Stampa l'output in questo formato:
Gravity: {Gravity} {GravityUnit}
Speed of Light: {SpeedOfLight} m/s
Projectile: {Name}
Initial Velocity: {InitialVelocity} m/s
Launch Angle: {LaunchAngle} degrees
Max Height: {maxHeight} mArrotonda l'altezza massima a 2 cifre decimali usando Math.Round(value, 2).
Ad esempio, se gli input sono Rocket, 50 e 45, l'output dovrebbe essere:
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 mProvalo tu
using System;
using Simulation;
class Program
{
public static void Main(string[] args)
{
// Leggi i dati di input
string name = Console.ReadLine();
double velocity = Convert.ToDouble(Console.ReadLine());
double angle = Convert.ToDouble(Console.ReadLine());
// TODO: Crea un oggetto Projectile con i valori di input
// TODO: Stampa le costanti fisiche (Gravity con l’unità di misura, velocità della luce)
// TODO: Stampa le informazioni sul proiettile (nome, velocità iniziale, angolo di lancio)
// TODO: Calcola e stampa l’altezza massima (arrotondata a 2 cifre decimali)
}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione orientata agli oggetti
File esterniNamespace e direttiveIntroduzione a classi e oggettiLa parola chiave "this"Metodi e parametriCampi e proprietàCostruttoriInizializzatori di oggettiRiepilogo - Calcolatrice semplice4Ereditarietà
Sintassi di base dell'ereditarietà (:)La parola chiave 'base'Parole chiave virtual e overrideClassi sealedLa classe base 'object'Riepilogo - Gerarchia dei dipendenti7Funzionalità avanzate
Sovraccarico degli operatoriIndicizzatori (this[])Override di ToString()Metodi di estensioneRiepilogo - Lista personalizzata10Pattern di progettazione Parte 1
Introduzione ai pattern di progettazioneSingleton thread-safePattern FactoryPattern Observer (eventi)Pattern Strategy2Proprietà e membri statici
Proprietà implementate automaticamenteProprietà di sola lettura e di sola scritturaCampi e metodi staticiClassi staticheMembri con corpo di espressione5Polimorfismo e interfacce
Polimorfismo a compile time e runtimeInterfaccia o classe astrattaInterfacce multipleInterfacce espliciteUpcasting e downcastingRipasso: calcolatore di forme8Concetti avanzati di programmazione a oggetti
Composizione invece dell'ereditarietàTipi generici (classi e metodi)Delegati ed eventiAttributi e reflectionIDisposable e istruzione usingNozioni di base sull'iniezione delle dipendenze11Pattern di progettazione, parte 2
Pattern del ComandoPattern dell’AdattatorePattern del DecoratorePattern Template MethodPattern dello StatoPattern Composito3Architettura delle classi
Dati di istanza vs staticiParole chiave 'readonly' e 'const'Campi di supportoRiepilogo - Gestore di conti bancari6Incapsulamento
Modificatori di accessoProprietà per l'incapsulamentoImplementazione dell'occultamento dei datiModelli di immutabilitàRiepilogo - Registri degli studentiEsercitati da solo: Compilatore C# online