Desafio C#
const, readonly e cálculo de área
Enunciado
Crie uma classe Circulo com um campo const double Pi = 3.14159 e um campo readonly double raio. O construtor recebe o raio. Adicione um método CalcularArea() que retorna Pi * raio * raio. No Main, instancie dois círculos com raios diferentes, imprima suas áreas e mostre que Pi é acessível via Circulo.Pi (é uma constante estática implícita).
Requisitos
- Usar
constpara Pi ereadonlypara raio - O método
CalcularAreadeve retornardouble - Imprimir as áreas com duas casas decimais
- Acessar
Circulo.Pidiretamente noMain
Código inicial
using System;
class Circulo
{
// Declare const Pi e readonly raio
public Circulo(double raio)
{
// Atribua o raio
}
public double CalcularArea()
{
// Retorne a área
return 0;
}
}
class Program
{
static void Main()
{
// Crie dois círculos e imprima as áreas
}
}
Saída esperada
Círculo 1: 78,54
Círculo 2: 314,16
Pi = 3,14159
Ver dica
const é implicitamente estático e pode ser acessado como Circulo.Pi. Use F2 na interpolação para formatar com duas casas decimais.
Mostrar solução
using System;
class Circulo
{
// const: valor fixo, acessível como Circulo.Pi
public const double Pi = 3.14159;
// readonly: atribuído apenas no construtor
private readonly double raio;
public Circulo(double raio)
{
this.raio = raio;
}
public double CalcularArea()
{
return Pi * raio * raio;
}
}
class Program
{
static void Main()
{
var c1 = new Circulo(5);
var c2 = new Circulo(10);
Console.WriteLine($"Círculo 1: {c1.CalcularArea():F2}");
Console.WriteLine($"Círculo 2: {c2.CalcularArea():F2}");
Console.WriteLine($"Pi = {Circulo.Pi}");
}
}
Passo a passo
public const double Pi = 3.14159;— constante em tempo de compilação, implicitamente estática.private readonly double raio;— campo somente leitura, que só pode ser atribuído na declaração ou no construtor.public Circulo(double raio) { this.raio = raio; }— o construtor atribui o valor araio; após isso, não pode ser alterado.CalcularArea()— usa a fórmulaPi * raio * raioe retornadouble.- No
Main,new Circulo(5)enew Circulo(10)criam instâncias com raios diferentes. {c1.CalcularArea():F2}— formata o resultado com duas casas decimais.Circulo.Pi— acessa a constante diretamente pela classe, sem instância.
Por que funciona
const é resolvido em tempo de compilação e embutido no código, por isso é implicitamente estático. readonly é um campo de instância (ou estático) que só pode ser atribuído na declaração ou no construtor, permitindo valores calculados em tempo de execução. A combinação garante que Pi nunca mude e que raio seja imutável após a construção.
Erros comuns
- Tentar atribuir
raiofora do construtor:c1.raio = 7;gera erro CS0191 (campo somente leitura não pode ser atribuído fora do construtor). - Usar
constcom valor não constante:const double Raio = Math.Sqrt(2);não compila, poisMath.Sqrtnão é constante em tempo de compilação. Usereadonly. - Esquecer
publicnoconst: sempublic,Circulo.Pinão é acessível noMain. - Confundir
constcomstatic readonly:consté embutido no assembly que o usa;static readonlyé resolvido em tempo de execução e mais flexível.
Outra forma de resolver
Usar static readonly double Pi = Math.PI; em vez de const. É preferível quando o valor vem de uma biblioteca ou cálculo, pois const exige literal em tempo de compilação.
Saída esperada
Círculo 1: 78,54
Círculo 2: 314,16
Pi = 3,14159