Médio C#

Contador com membro estático

Enunciado

Crie uma classe Contador com um campo de instância Valor (int) e um campo estático TotalInstancias (int). O construtor sem parâmetros deve inicializar Valor com 0 e incrementar TotalInstancias. Adicione um método Incrementar() que aumenta Valor em 1. No Main, crie três contadores, incremente o primeiro duas vezes e o segundo uma vez, e exiba o valor de cada contador e o total de instâncias criadas.

Requisitos

  • A classe Contador deve ter o campo de instância Valor e o campo estático TotalInstancias.
  • O construtor sem parâmetros deve inicializar Valor com 0 e incrementar TotalInstancias.
  • O método Incrementar() deve somar 1 ao Valor do objeto.
  • O Main deve criar três contadores, incrementar conforme especificado e imprimir os valores e o total.

Código inicial

using System;

public class Contador
{
    // Declare os campos

    // Declare o construtor

    // Declare o método Incrementar
}

public class Program
{
    public static void Main()
    {
        // Crie três contadores e realize as operações
    }
}

Saída esperada

Contador 1: 2
Contador 2: 1
Contador 3: 0
Total de instâncias: 3
Ver dica

O campo estático deve ser incrementado dentro do construtor usando TotalInstancias++. Acesse-o no Main como Contador.TotalInstancias.

Mostrar solução
using System;

public class Contador
{
    // Campo de instância: cada objeto tem o seu.
    public int Valor;

    // Campo estático: compartilhado por todas as instâncias.
    public static int TotalInstancias;

    // Construtor sem parâmetros.
    public Contador()
    {
        Valor = 0;
        TotalInstancias++; // incrementa o contador global
    }

    // Método de instância que incrementa o valor do objeto.
    public void Incrementar()
    {
        Valor++;
    }
}

public class Program
{
    public static void Main()
    {
        // Cria três contadores.
        Contador c1 = new Contador();
        Contador c2 = new Contador();
        Contador c3 = new Contador();

        // Incrementa conforme o enunciado.
        c1.Incrementar();
        c1.Incrementar();
        c2.Incrementar();

        // Exibe os valores individuais.
        Console.WriteLine($"Contador 1: {c1.Valor}");
        Console.WriteLine($"Contador 2: {c2.Valor}");
        Console.WriteLine($"Contador 3: {c3.Valor}");

        // Exibe o total de instâncias (membro estático).
        Console.WriteLine($"Total de instâncias: {Contador.TotalInstancias}");
    }
}

Passo a passo

  1. Declaramos Valor como campo de instância e TotalInstancias como campo estático.
  2. O construtor sem parâmetros inicializa Valor com 0 e incrementa TotalInstancias.
  3. O método Incrementar() soma 1 ao campo Valor do objeto atual.
  4. No Main, criamos três objetos Contador, o que faz TotalInstancias chegar a 3.
  5. Chamamos Incrementar() duas vezes em c1 e uma vez em c2.
  6. Imprimimos os valores de cada contador e o total de instâncias usando Contador.TotalInstancias.

Por que funciona

Cada objeto tem seu próprio Valor, então as operações em um não afetam os outros. Já TotalInstancias é estático: existe uma única cópia compartilhada por todas as instâncias. O construtor é o lugar ideal para incrementá-lo, pois é executado exatamente uma vez por objeto criado.

Erros comuns

  • Tentar acessar TotalInstancias como c1.TotalInstancias: embora o compilador permita, o correto é Contador.TotalInstancias para deixar claro que é estático.
  • Esquecer de inicializar Valor no construtor: o campo seria 0 por padrão, mas é boa prática explícita.
  • Declarar TotalInstancias como não estático: cada objeto teria sua própria cópia e o total não seria compartilhado.

Outra forma de resolver

Usar uma propriedade estática com get e um campo privado:

private static int _total;
public static int TotalInstancias => _total;

Isso impede modificações externas acidentais.

Saída esperada

Contador 1: 2
Contador 2: 1
Contador 3: 0
Total de instâncias: 3