Menu
Coddy logo textTech

Dados de Instância vs Estáticos

Parte da seção Programação Orientada a Objetos do Journey de C# da Coddy — lição 15 de 70.

Agora que você entende os membros estáticos, vamos esclarecer quando usar dados de instância versus dados estáticos. Essa decisão molda como sua classe armazena e compartilha informações.

Dados de instância pertencem a cada objeto individualmente. Cada objeto recebe sua própria cópia, e alterações em um objeto não afetam os outros:

public class BankAccount
{
    public string Owner { get; set; }      // Instância - única por conta
    public decimal Balance { get; set; }   // Instância - única por conta
}

Cada BankAccount tem seu próprio proprietário e saldo. Isso faz sentido porque contas diferentes mantêm quantias diferentes para pessoas diferentes.

Dados estáticos pertencem à própria classe e são compartilhados entre todas as instâncias:

public class BankAccount
{
    public static decimal InterestRate = 0.05m;  // Estático - o mesmo para todos
    public static int TotalAccounts = 0;         // Estático - rastreia todas as contas
    
    public string Owner { get; set; }
    public decimal Balance { get; set; }
}

A taxa de juros se aplica igualmente a cada conta, portanto faz sentido como estática. O contador total de contas rastreia informações de toda a classe, não dados de contas individuais.

Uma regra simples: se os dados descrevem um objeto específico, torne-os instance. Se descreverem a class como um todo ou devam ser compartilhados, torne-os static. Misturá-los incorretamente leva a bugs onde os dados mudam inesperadamente entre objetos ou não ficam acessíveis quando necessário.

challenge icon

Desafio

Fácil

Vamos construir um rastreador de sessão de jogo que demonstra a diferença entre dados que pertencem a jogadores individuais versus dados compartilhados em todo o jogo.

Você criará dois arquivos para organizar seu código:

  • Player.cs: Defina uma classe Player no namespace GameSession. Cada jogador tem seu próprio Username (string) e Score (int) - estes são únicos para cada jogador. A classe também deve rastrear informações que se aplicam a todos os jogadores: um campo estático GameName (string) que armazena o nome do jogo que todos estão jogando, e um campo estático TotalPlayers (int) que conta quantos jogadores entraram. Inclua um construtor que receba o nome de usuário e a pontuação inicial, e incremente automaticamente a contagem total de jogadores. Adicione um método estático SetGameName(string name) para configurar o nome do jogo.
  • Program.cs: No seu arquivo principal, configure o jogo e crie jogadores com base na entrada. Primeiro defina o nome do jogo, depois crie dois jogadores e exiba suas informações individuais junto com os dados compartilhados do jogo.

Você receberá cinco entradas:

  • O nome do jogo
  • O nome de usuário do primeiro jogador
  • A pontuação inicial do primeiro jogador
  • O nome de usuário do segundo jogador
  • A pontuação inicial do segundo jogador

Imprima a saída neste formato:

Game: {GameName}
Player: {Username}, Score: {Score}
Player: {Username}, Score: {Score}
Total Players: {TotalPlayers}

Por exemplo, se as entradas forem BattleArena, DragonSlayer, 1500, ShadowNinja, e 2200, a saída deve ser:

Game: BattleArena
Player: DragonSlayer, Score: 1500
Player: ShadowNinja, Score: 2200
Total Players: 2

Pense cuidadosamente sobre quais dados devem ser baseados em instância (diferentes para cada jogador) e quais devem ser estáticos (compartilhados entre todos os jogadores). O nome do jogo e a contagem total de jogadores descrevem a sessão como um todo, enquanto o nome de usuário e a pontuação são únicos para cada indivíduo.

Folha de consulta

Use dados de instância para propriedades que são exclusivas de cada objeto:

public class BankAccount
{
    public string Owner { get; set; }      // Cada conta tem seu próprio proprietário
    public decimal Balance { get; set; }   // Cada conta tem seu próprio saldo
}

Use dados estáticos para propriedades compartilhadas entre todas as instâncias de uma classe:

public class BankAccount
{
    public static decimal InterestRate = 0.05m;  // O mesmo para todas as contas
    public static int TotalAccounts = 0;         // Rastreia todas as contas
    
    public string Owner { get; set; }
    public decimal Balance { get; set; }
}

Regra de decisão: Se os dados descrevem um objeto específico, use dados de instância. Se descrevem a classe como um todo ou devem ser compartilhados, use dados estáticos.

Experimente você mesmo

using System;

namespace GameSession
{
    class Program
    {
        public static void Main(string[] args)
        {
            // Ler as entradas
            string gameName = Console.ReadLine();
            string username1 = Console.ReadLine();
            int score1 = Convert.ToInt32(Console.ReadLine());
            string username2 = Console.ReadLine();
            int score2 = Convert.ToInt32(Console.ReadLine());

            // TODO: Definir o nome do jogo usando o método estático

            // TODO: Criar dois objetos Player com os dados de entrada

            // TODO: Imprimir a saída no formato exigido
            // Jogo: {GameName}
            // Jogador: {Username}, Pontuação: {Score}
            // Jogador: {Username}, Pontuação: {Score}
            // Total de Jogadores: {TotalPlayers}
        }
    }
}
quiz iconTeste seus conhecimentos

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