Campos e Métodos Estáticos
Parte da seção Programação Orientada a Objetos do Journey de C# da Coddy — lição 12 de 70.
Até agora, cada campo e método que criamos pertence a objetos individuais. Mas às vezes você precisa de dados ou comportamentos que pertençam à própria classe, compartilhados entre todas as instâncias. É aí que entra a palavra-chave static.
Um campo estático é compartilhado por todos os objetos de uma classe. Existe apenas uma cópia, não importa quantas instâncias você crie:
public class Player
{
public static int TotalPlayers = 0;
public string Name { get; set; }
public Player(string name)
{
Name = name;
TotalPlayers++;
}
}Toda vez que um novo Player é criado, o TotalPlayers aumenta. Todos os jogadores compartilham este mesmo contador.
Um método estático pertence à classe e pode ser chamado sem criar um objeto:
public class Calculator
{
public static int Add(int a, int b)
{
return a + b;
}
}
// Chamado na classe, não em uma instância
int result = Calculator.Add(5, 3);Observe que você acessa membros estáticos usando o nome da classe, não uma referência de objeto. Métodos estáticos não podem acessar campos de instância ou usar this, pois não pertencem a nenhum objeto específico.
Você já usou membros estáticos sem perceber. Console.WriteLine() é um método estático, e Math.PI é um campo estático.
Desafio
FácilVamos construir um sistema de rastreamento de pedidos que utiliza membros estáticos para acompanhar todos os pedidos feitos em sua aplicação.
Você criará dois arquivos para organizar seu código:
Order.cs: Defina uma classeOrderno namespaceOrderSystem. Cada pedido deve ter uma propriedade de instânciaOrderId(int) eCustomerName(string). A classe também deve rastrear o número total de pedidos criados usando um campo estáticoTotalOrders, e fornecer um método estáticoGetNextOrderId()que retorna o próximo ID de pedido disponível (começando em 1). O construtor deve aceitar um nome de cliente, atribuir automaticamente o ID do pedido usando o método estático e incrementar a contagem total de pedidos.Program.cs: No seu arquivo principal, crie pedidos com base na entrada e exiba seus detalhes junto com a contagem total de pedidos.
Você receberá duas entradas representando nomes de clientes para dois pedidos separados.
Para cada pedido, imprima seus detalhes neste formato:
Order #{OrderId} - Customer: {CustomerName}Após criar ambos os pedidos, imprima a contagem total:
Total Orders: {TotalOrders}Por exemplo, se as entradas forem Alice e Bob, a saída deve ser:
Order #1 - Customer: Alice
Order #2 - Customer: Bob
Total Orders: 2Folha de consulta
A palavra-chave static cria membros que pertencem à própria classe, em vez de instâncias individuais.
Campos estáticos são compartilhados entre todos os objetos de uma classe. Existe apenas uma cópia, independentemente de quantas instâncias sejam criadas:
public class Player
{
public static int TotalPlayers = 0;
public string Name { get; set; }
public Player(string name)
{
Name = name;
TotalPlayers++;
}
}Métodos estáticos pertencem à classe e podem ser chamados sem a criação de um objeto:
public class Calculator
{
public static int Add(int a, int b)
{
return a + b;
}
}
// Chamado na classe, não em uma instância
int result = Calculator.Add(5, 3);Membros estáticos são acessados usando o nome da classe, não uma referência de objeto. Métodos estáticos não podem acessar campos de instância ou usar this, pois não pertencem a nenhum objeto específico.
Exemplos comuns de membros estáticos incluem Console.WriteLine() (método estático) e Math.PI (campo estático).
Experimente você mesmo
using System;
using OrderSystem;
class Program
{
public static void Main(string[] args)
{
// Ler os nomes dos clientes
string customer1 = Console.ReadLine();
string customer2 = Console.ReadLine();
// TODO: Criar dois objetos Order com os nomes dos clientes
// TODO: Imprimir os detalhes de cada pedido no formato:
// Order #{OrderId} - Customer: {CustomerName}
// TODO: Imprimir a contagem total de pedidos no formato:
// Total Orders: {TotalOrders}
}
}
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