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 const para Pi e readonly para raio
  • O método CalcularArea deve retornar double
  • Imprimir as áreas com duas casas decimais
  • Acessar Circulo.Pi diretamente no Main

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

  1. public const double Pi = 3.14159; — constante em tempo de compilação, implicitamente estática.
  2. private readonly double raio; — campo somente leitura, que só pode ser atribuído na declaração ou no construtor.
  3. public Circulo(double raio) { this.raio = raio; } — o construtor atribui o valor a raio; após isso, não pode ser alterado.
  4. CalcularArea() — usa a fórmula Pi * raio * raio e retorna double.
  5. No Main, new Circulo(5) e new Circulo(10) criam instâncias com raios diferentes.
  6. {c1.CalcularArea():F2} — formata o resultado com duas casas decimais.
  7. 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 raio fora do construtor: c1.raio = 7; gera erro CS0191 (campo somente leitura não pode ser atribuído fora do construtor).
  • Usar const com valor não constante: const double Raio = Math.Sqrt(2); não compila, pois Math.Sqrt não é constante em tempo de compilação. Use readonly.
  • Esquecer public no const: sem public, Circulo.Pi não é acessível no Main.
  • Confundir const com static 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