Menu
Coddy logo textTech

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.

challenge icon

Sfida

Facile

Costruiamo 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 classe PhysicsConstants nello spazio dei nomi Simulation. Questa classe deve contenere costanti universali che non cambiano mai e sono uguali ovunque:
    • Un campo const Gravity impostato su 9.81
    • Un campo const SpeedOfLight impostato su 299792458
    • Una stringa const GravityUnit impostata su "m/s^2"
  • Projectile.cs: definisci una classe Projectile nello spazio dei nomi Simulation. Ogni proiettile ha valori che devono essere impostati una sola volta al momento della creazione e non devono più essere modificati:
    • Un campo readonly Name (stringa)
    • Un campo readonly InitialVelocity (double)
    • Un campo readonly LaunchAngle (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). Usa Math.Sin() e converti i gradi in radianti moltiplicando per Math.PI / 180
  • 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} m

Arrotonda 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 m

Provalo 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)
    }
}
quiz iconMettiti alla prova

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

Esercitati da solo: Compilatore C# online