Menu
Coddy logo textTech

Datos de instancia vs. estáticos

Parte de la sección Programación Orientada a Objetos del Journey de C# de Coddy. Lección 15 de 70.

Ahora que entiendes los miembros estáticos, aclaremos cuándo usar datos de instancia frente a datos estáticos. Esta decisión define cómo tu clase almacena y comparte la información.

Los datos de instancia pertenecen a cada objeto individualmente. Cada objeto obtiene su propia copia, y los cambios en un objeto no afectan a los demás:

public class BankAccount
{
    public string Owner { get; set; }      // Instancia: única por cuenta
    public decimal Balance { get; set; }   // Instancia: única por cuenta
}

Cada BankAccount tiene su propio titular y saldo. Esto tiene sentido porque diferentes cuentas contienen diferentes cantidades para diferentes personas.

Los datos estáticos pertenecen a la clase misma y se comparten entre todas las instancias:

public class BankAccount
{
    public static decimal InterestRate = 0.05m;  // Estático - igual para todos
    public static int TotalAccounts = 0;         // Estático - rastrea todas las cuentas
    
    public string Owner { get; set; }
    public decimal Balance { get; set; }
}

La tasa de interés se aplica por igual a todas las cuentas, por lo que tiene sentido que sea estática. El contador total de cuentas realiza un seguimiento de la información de toda la clase, no de los datos de una cuenta individual.

Una regla simple: si los datos describen un objeto específico, hágalos de instancia. Si describen la clase en su conjunto o deben compartirse, hágalos estáticos. Mezclarlos de forma incorrecta provoca errores donde los datos cambian inesperadamente entre objetos o no están accesibles cuando se necesitan.

challenge icon

Desafío

Fácil

Construyamos un rastreador de sesiones de juego que demuestre la diferencia entre los datos que pertenecen a jugadores individuales y los datos compartidos en todo el juego.

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

  • Player.cs: Define una clase Player en el espacio de nombres GameSession. Cada jugador tiene su propio Username (string) y Score (int); estos son únicos para cada jugador. La clase también debe registrar información que se aplica a todos los jugadores: un campo estático GameName (string) que almacena el nombre del juego al que todos están jugando, y un campo estático TotalPlayers (int) que cuenta cuántos jugadores se han unido. Incluye un constructor que reciba el nombre de usuario y la puntuación inicial, e incremente automáticamente el recuento total de jugadores. Añade un método estático SetGameName(string name) para configurar el nombre del juego.
  • Program.cs: En tu archivo principal, configura el juego y crea jugadores a partir de la entrada. Primero establece el nombre del juego, después crea dos jugadores y muestra su información individual junto con los datos compartidos del juego.

Recibirás cinco entradas:

  • El nombre del juego
  • El nombre de usuario del primer jugador
  • La puntuación inicial del primer jugador
  • El nombre de usuario del segundo jugador
  • La puntuación inicial del segundo jugador

Imprime la salida con este formato:

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

Por ejemplo, si las entradas son BattleArena, DragonSlayer, 1500, ShadowNinja y 2200, la salida debería ser:

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

Piensa detenidamente qué datos deberían basarse en instancias (diferentes para cada jugador) y cuáles deberían ser estáticos (compartidos entre todos los jugadores). El nombre del juego y el recuento total de jugadores describen la sesión en su conjunto, mientras que el nombre de usuario y la puntuación son únicos para cada individuo.

Pruébalo tú mismo

using System;

namespace GameSession
{
    class Program
    {
        public static void Main(string[] args)
        {
            // Leer las 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: Establecer el nombre del juego usando el método estático

            // TODO: Crear dos objetos Player con los datos de entrada

            // TODO: Imprimir la salida en el formato requerido
            // Juego: {GameName}
            // Jugador: {Username}, Puntuación: {Score}
            // Jugador: {Username}, Puntuación: {Score}
            // Total Players: {TotalPlayers}
        }
    }
}
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

Practica por tu cuenta: Compilador de C# online