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
Contadordeve ter o campo de instânciaValore o campo estáticoTotalInstancias. - O construtor sem parâmetros deve inicializar
Valorcom 0 e incrementarTotalInstancias. - O método
Incrementar()deve somar 1 aoValordo objeto. - O
Maindeve 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
- Declaramos
Valorcomo campo de instância eTotalInstanciascomo campo estático. - O construtor sem parâmetros inicializa
Valorcom 0 e incrementaTotalInstancias. - O método
Incrementar()soma 1 ao campoValordo objeto atual. - No
Main, criamos três objetosContador, o que fazTotalInstanciaschegar a 3. - Chamamos
Incrementar()duas vezes emc1e uma vez emc2. - 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
TotalInstanciascomoc1.TotalInstancias: embora o compilador permita, o correto éContador.TotalInstanciaspara deixar claro que é estático. - Esquecer de inicializar
Valorno construtor: o campo seria 0 por padrão, mas é boa prática explícita. - Declarar
TotalInstanciascomo 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