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.
Desafio
FácilVamos 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 classePlayerno namespaceGameSession. Cada jogador tem seu próprioUsername(string) eScore(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áticoGameName(string) que armazena o nome do jogo que todos estão jogando, e um campo estáticoTotalPlayers(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áticoSetGameName(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: 2Pense 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}
}
}
}
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
1Fundamentos de POO
Arquivos ExternosNamespaces e DiretivasIntrodução a Classes e ObjetosA Palavra-chave 'this'Métodos e ParâmetrosCampos vs PropriedadesConstrutoresInicializadores de ObjetosRecapitulação - Calculadora Simples4Herança
Sintaxe Básica de Herança (:)A Palavra-chave 'base'Palavras-chave Virtual e OverrideClasses SeladasA Classe Base 'object'Recapitulação - Hierarquia de Funcionários7Recursos Avançados
Sobrecarga de OperadoresIndexadores (this[])Sobrescrita de ToString()Métodos de ExtensãoRecapitulação - Lista Personalizada10Padrões de Projeto Parte 1
Introdução aos Padrões de ProjetoSingleton Thread-SafePadrão FactoryPadrão Observer (Eventos)Padrão Strategy2Propriedades e Membros Estáticos
Propriedades AutoimplementadasPropriedades de Apenas Leitura/EscritaCampos e Métodos EstáticosClasses EstáticasMembros com Corpo de Expressão5Polimorfismo e Interfaces
Polimorfismo: Compilação vs ExecuçãoInterface vs Classe AbstrataMúltiplas InterfacesInterfaces ExplícitasUpcasting e DowncastingRecapitulação - Calculadora de Formas8Conceitos Avançados de POO
Composição sobre HerançaGenerics (Classes e Métodos)Delegates e EventosAtributos e ReflectionIDisposable e a Instrução usingFundamentos de Injeção de Dependência11Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão Composite3Arquitetura de Classes
Dados de Instância vs EstáticosPalavras-chave 'readonly' e 'const'Campos de SuporteRecapitulação - Gerenciador de Conta Bancária6Encapsulamento
Modificadores de AcessoPropriedades para EncapsulamentoImplementação de Ocultação de DadosPadrões de ImutabilidadeRecapitulação - Registros de Estudantes9Argumentos Variáveis
A Palavra-chave 'params'Parâmetros OpcionaisArgumentos NomeadosSobrecarga de Métodos