Menu
Coddy logo textTech

Palavras-chave 'readonly' e 'const'

Parte da seção Programação Orientada a Objetos do Journey de C# da Coddy — lição 16 de 70.

O C# fornece duas palavras-chave para criar valores que não podem ser alterados: const e readonly. Embora ambas impeçam a modificação, elas funcionam de maneira diferente e servem a propósitos distintos.

Um campo const deve ser atribuído na declaração e seu valor é determinado em tempo de compilação. Ele é implicitamente estático, o que significa que pertence à classe em vez de instâncias:

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

Você acessa constantes através do nome da classe: GameSettings.MaxPlayers. Constantes funcionam apenas com tipos primitivos, strings e null porque o compilador deve saber o valor exato.

Um campo readonly pode ser atribuído na declaração ou em um construtor, e seu valor é determinado em tempo de execução:

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

Ao contrário de const, campos readonly podem conter qualquer tipo e podem ter valores diferentes por instância. Uma vez que o construtor termina, o valor não pode mudar.

Use const para valores que são verdadeiramente universais e nunca mudarão, como constantes matemáticas. Use readonly para valores que devem ser definidos uma única vez, mas que podem variar entre objetos ou precisar de cálculo em tempo de execução.

challenge icon

Desafio

Fácil

Vamos construir um sistema de configuração de simulação de física que demonstra quando usar const para constantes universais versus readonly para valores que são definidos uma única vez em tempo de execução.

Você criará dois arquivos para organizar seu código:

  • PhysicsConstants.cs: Defina uma classe PhysicsConstants no namespace Simulation. Esta classe deve conter constantes universais que nunca mudam e são as mesmas em todos os lugares:
    • Um campo const Gravity definido como 9.81
    • Um campo const SpeedOfLight definido como 299792458
    • Uma string const GravityUnit definida como "m/s^2"
  • Projectile.cs: Defina uma classe Projectile no namespace Simulation. Cada projétil possui valores que devem ser definidos uma vez quando criados e nunca modificados depois:
    • Um campo readonly Name (string)
    • Um campo readonly InitialVelocity (double)
    • Um campo readonly LaunchAngle (double, em graus)
    • Um construtor que aceita e define todos os três valores
    • Um método GetMaxHeight() que calcula a altura máxima usando a fórmula: (velocity^2 * sin^2(angle)) / (2 * gravity). Use Math.Sin() e converta graus para radianos multiplicando por Math.PI / 180
  • Program.cs: No seu arquivo principal, crie um projétil usando os valores de entrada e exiba as constantes de física junto com a altura máxima calculada do projétil.

Você receberá três entradas:

  • Nome do projétil
  • Velocidade inicial (em m/s)
  • Ângulo de lançamento (em graus)

Imprima a saída neste 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

Arredonde a altura máxima para 2 casas decimais usando Math.Round(value, 2).

Por exemplo, se as entradas forem Rocket, 50 e 45, a saída deve ser:

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

Folha de consulta

O C# fornece duas palavras-chave para criar valores imutáveis: const e readonly.

Um campo const deve ser atribuído na declaração, é determinado em tempo de compilação e é implicitamente estático:

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

Acesse constantes através do nome da classe: GameSettings.MaxPlayers. Constantes funcionam apenas com tipos primitivos, strings e null.

Um campo readonly pode ser atribuído na declaração ou em um construtor, e seu valor é determinado em tempo de execução:

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

Campos readonly podem conter qualquer tipo e podem ter valores diferentes por instância. Assim que o construtor termina, o valor não pode mudar.

Use const para valores universais que nunca mudarão. Use readonly para valores que devem ser definidos uma única vez, mas que podem variar entre objetos ou precisar de cálculo em tempo de execução.

Experimente você mesmo

using System;
using Simulation;

class Program
{
    public static void Main(string[] args)
    {
        // Ler as entradas
        string name = Console.ReadLine();
        double velocity = Convert.ToDouble(Console.ReadLine());
        double angle = Convert.ToDouble(Console.ReadLine());

        // TODO: Criar um objeto Projectile com os valores de entrada

        // TODO: Imprimir as constantes físicas (Gravidade com unidade, Velocidade da Luz)

        // TODO: Imprimir as informações do projétil (Nome, Velocidade Inicial, Ângulo de Lançamento)

        // TODO: Calcular e imprimir a altura máxima (arredondada para 2 casas decimais)
    }
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação Orientada a Objetos