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.
Desafio
FácilVamos 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 classePhysicsConstantsno namespaceSimulation. Esta classe deve conter constantes universais que nunca mudam e são as mesmas em todos os lugares:- Um campo
constGravitydefinido como9.81 - Um campo
constSpeedOfLightdefinido como299792458 - Uma string
constGravityUnitdefinida como"m/s^2"
- Um campo
Projectile.cs: Defina uma classeProjectileno namespaceSimulation. Cada projétil possui valores que devem ser definidos uma vez quando criados e nunca modificados depois:- Um campo
readonlyName(string) - Um campo
readonlyInitialVelocity(double) - Um campo
readonlyLaunchAngle(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). UseMath.Sin()e converta graus para radianos multiplicando porMath.PI / 180
- Um campo
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} mArredonde 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 mFolha 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)
}
}
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
1Fundamentos de POO
Arquivos ExternosNamespaces e DiretivasIntrodução a Classes e ObjetosA Palavra-chave 'this'Métodos e ParâmetrosCampos vs PropriedadesConstrutoresInicializadores de ObjetosRecapitulação - Calculadora Simples4Herança
Sintaxe Básica de Herança (:)A Palavra-chave 'base'Palavras-chave Virtual e OverrideClasses SeladasA Classe Base 'object'Recapitulação - Hierarquia de Funcionários7Recursos Avançados
Sobrecarga de OperadoresIndexadores (this[])Sobrescrita de ToString()Métodos de ExtensãoRecapitulação - Lista Personalizada10Padrões de Projeto Parte 1
Introdução aos Padrões de ProjetoSingleton Thread-SafePadrão FactoryPadrão Observer (Eventos)Padrão Strategy2Propriedades e Membros Estáticos
Propriedades AutoimplementadasPropriedades de Apenas Leitura/EscritaCampos e Métodos EstáticosClasses EstáticasMembros com Corpo de Expressão5Polimorfismo e Interfaces
Polimorfismo: Compilação vs ExecuçãoInterface vs Classe AbstrataMúltiplas InterfacesInterfaces ExplícitasUpcasting e DowncastingRecapitulação - Calculadora de Formas8Conceitos Avançados de POO
Composição sobre HerançaGenerics (Classes e Métodos)Delegates e EventosAtributos e ReflectionIDisposable e a Instrução usingFundamentos de Injeção de Dependência11Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão Composite3Arquitetura de Classes
Dados de Instância vs EstáticosPalavras-chave 'readonly' e 'const'Campos de SuporteRecapitulação - Gerenciador de Conta Bancária6Encapsulamento
Modificadores de AcessoPropriedades para EncapsulamentoImplementação de Ocultação de DadosPadrões de ImutabilidadeRecapitulação - Registros de Estudantes9Argumentos Variáveis
A Palavra-chave 'params'Parâmetros OpcionaisArgumentos NomeadosSobrecarga de Métodos