Menu
Coddy logo textTech

Campos y métodos estáticos

Parte de la sección Programación Orientada a Objetos del Journey de C# de Coddy — lección 12 de 70.

Hasta ahora, cada campo y método que hemos creado pertenece a objetos individuales. Pero a veces necesitas datos o comportamientos que pertenecen a la clase misma, compartidos entre todas las instancias. Ahí es donde entra la palabra clave static.

Un campo estático es compartido por todos los objetos de una clase. Solo hay una copia, sin importar cuántas instancias crees:

public class Player
{
    public static int TotalPlayers = 0;
    public string Name { get; set; }
    
    public Player(string name)
    {
        Name = name;
        TotalPlayers++;
    }
}

Cada vez que se crea un nuevo Player, TotalPlayers aumenta. Todos los jugadores comparten este mismo contador.

Un método estático pertenece a la clase y puede ser llamado sin crear un objeto:

public class Calculator
{
    public static int Add(int a, int b)
    {
        return a + b;
    }
}

// Llamado en la clase, no en una instancia
int result = Calculator.Add(5, 3);

Observa que accedes a los miembros estáticos utilizando el nombre de la clase, no una referencia de objeto. Los métodos estáticos no pueden acceder a campos de instancia ni utilizar this, ya que no pertenecen a ningún objeto específico.

Ya has utilizado miembros estáticos sin darte cuenta. Console.WriteLine() es un método estático y Math.PI es un campo estático.

challenge icon

Desafío

Fácil

Vamos a construir un sistema de seguimiento de pedidos que utiliza miembros estáticos para llevar la cuenta de todos los pedidos realizados en tu aplicación.

Crearás dos archivos para organizar tu código:

  • Order.cs: Define una clase Order en el espacio de nombres OrderSystem. Cada pedido debe tener una propiedad de instancia OrderId (int) y CustomerName (string). La clase también debe rastrear el número total de pedidos creados utilizando un campo estático TotalOrders, y proporcionar un método estático GetNextOrderId() que devuelva el siguiente ID de pedido disponible (comenzando desde 1). El constructor debe aceptar un nombre de cliente, asignar automáticamente el ID del pedido utilizando el método estático e incrementar el recuento total de pedidos.
  • Program.cs: En tu archivo principal, crea pedidos basados en la entrada y muestra sus detalles junto con el recuento total de pedidos.

Recibirás dos entradas que representan los nombres de los clientes para dos pedidos distintos.

Para cada pedido, imprime sus detalles en este formato:

Order #{OrderId} - Customer: {CustomerName}

Después de crear ambos pedidos, imprime el recuento total:

Total Orders: {TotalOrders}

Por ejemplo, si las entradas son Alice y Bob, la salida debería ser:

Order #1 - Customer: Alice
Order #2 - Customer: Bob
Total Orders: 2

Hoja de referencia

La palabra clave static crea miembros que pertenecen a la clase misma en lugar de a instancias individuales.

Los campos estáticos se comparten entre todos los objetos de una clase. Solo existe una copia, independientemente de cuántas instancias se creen:

public class Player
{
    public static int TotalPlayers = 0;
    public string Name { get; set; }
    
    public Player(string name)
    {
        Name = name;
        TotalPlayers++;
    }
}

Los métodos estáticos pertenecen a la clase y pueden llamarse sin crear un objeto:

public class Calculator
{
    public static int Add(int a, int b)
    {
        return a + b;
    }
}

// Called on the class, not an instance
int result = Calculator.Add(5, 3);

Se accede a los miembros estáticos utilizando el nombre de la clase, no una referencia de objeto. Los métodos estáticos no pueden acceder a campos de instancia ni usar this, ya que no pertenecen a ningún objeto específico.

Ejemplos comunes de miembros estáticos incluyen Console.WriteLine() (método estático) y Math.PI (campo estático).

Pruébalo tú mismo

using System;
using OrderSystem;

class Program
{
    public static void Main(string[] args)
    {
        // Leer nombres de clientes
        string customer1 = Console.ReadLine();
        string customer2 = Console.ReadLine();

        // TODO: Crear dos objetos Order con los nombres de los clientes

        // TODO: Imprimir los detalles de cada pedido en el formato:
        // Order #{OrderId} - Customer: {CustomerName}

        // TODO: Imprimir el recuento total de pedidos en el formato:
        // Total Orders: {TotalOrders}
    }
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación Orientada a Objetos