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 de instância. Se descrevem a classe como um todo ou devem ser compartilhados, torne-os estáticos. Misturá-los incorretamente causa bugs nos quais os dados mudam inesperadamente entre os objetos ou não ficam acessíveis quando necessário.

challenge icon

Desafio

Fácil

Vamos criar um rastreador de sessão de jogo que demonstra a diferença entre dados que pertencem a jogadores individuais e dados compartilhados por todo o jogo.

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

  • Player.cs: Defina uma classe Player no namespace GameSession. Cada jogador terá seu próprio Username (string) e Score (int) — esses valores são exclusivos de cada jogador. A classe também deverá acompanhar 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 arquivo principal, configure o jogo e crie jogadores com base na entrada. Primeiro, defina o nome do jogo; em seguida, crie dois jogadores e exiba as informações individuais deles 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 deverá 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 por 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 exclusivos de cada indivíduo.

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 Players: {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

Pratique por conta própria: Compilador de C# online