Menu
Coddy logo textTech

Dati di istanza vs statici

Fa parte della sezione Programmazione orientata agli oggetti del percorso C# di Coddy. Lezione 15 di 70.

Ora che hai compreso i membri statici, chiariamo quando usare i dati di istanza anziché i dati statici. Questa decisione determina il modo in cui la tua classe memorizza e condivide le informazioni.

I dati di istanza appartengono individualmente a ciascun oggetto. Ogni oggetto ha la propria copia e le modifiche a un oggetto non influiscono sugli altri:

public class BankAccount
{
    public string Owner { get; set; }      // Istanza - univoca per ogni conto
    public decimal Balance { get; set; }   // Istanza - univoca per ogni conto
}

Ogni BankAccount ha il proprio titolare e saldo. Ha senso, perché conti diversi contengono importi diversi appartenenti a persone diverse.

I dati statici appartengono alla classe stessa e sono condivisi tra tutte le istanze:

public class BankAccount
{
    public static decimal InterestRate = 0.05m;  // Statico - uguale per tutti
    public static int TotalAccounts = 0;         // Statico - tiene traccia di tutti i conti
    
    public string Owner { get; set; }
    public decimal Balance { get; set; }
}

Il tasso d'interesse si applica allo stesso modo a ogni conto, quindi ha senso che sia statico. Il contatore totale dei conti tiene traccia delle informazioni relative all'intera classe, non dei dati dei singoli conti.

Una regola semplice: se i dati descrivono un oggetto specifico, rendili di istanza. Se descrivono la classe nel suo insieme o devono essere condivisi, rendili statici. Usarli in modo scorretto porta a bug in cui i dati cambiano inaspettatamente tra gli oggetti o non sono accessibili quando servono.

challenge icon

Sfida

Facile

Costruiamo un tracker delle sessioni di gioco che mostra la differenza tra i dati appartenenti ai singoli giocatori e quelli condivisi da tutta la partita.

Creerai due file per organizzare il codice:

  • Player.cs: definisci una classe Player nello spazio dei nomi GameSession. Ogni giocatore ha il proprio Username (stringa) e Score (int), univoci per ciascun giocatore. La classe deve anche tenere traccia delle informazioni che riguardano tutti i giocatori: un campo statico GameName (stringa) che memorizza il nome della partita a cui stanno giocando tutti e un campo statico TotalPlayers (int) che conta quanti giocatori si sono uniti. Includi un costruttore che accetta il nome utente e il punteggio iniziale e incrementa automaticamente il conteggio totale dei giocatori. Aggiungi un metodo statico SetGameName(string name) per impostare il nome della partita.
  • Program.cs: nel file principale, imposta la partita e crea i giocatori in base all'input. Per prima cosa imposta il nome della partita, poi crea due giocatori e visualizza le loro informazioni individuali insieme ai dati condivisi della partita.

Riceverai cinque input:

  • Il nome della partita
  • Il nome utente del primo giocatore
  • Il punteggio iniziale del primo giocatore
  • Il nome utente del secondo giocatore
  • Il punteggio iniziale del secondo giocatore

Stampa l'output in questo formato:

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

Ad esempio, se gli input sono BattleArena, DragonSlayer, 1500, ShadowNinja e 2200, l'output dovrebbe essere:

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

Rifletti attentamente su quali dati dovrebbero essere di istanza (diversi per ogni giocatore) e quali statici (condivisi da tutti i giocatori). Il nome della partita e il numero totale di giocatori descrivono la sessione nel suo insieme, mentre il nome utente e il punteggio sono unici per ciascun individuo.

Provalo tu

using System;

namespace GameSession
{
    class Program
    {
        public static void Main(string[] args)
        {
            // Leggi gli input
            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: Imposta il nome del gioco usando il metodo statico

            // TODO: Crea due oggetti Player con i dati di input

            // TODO: Stampa l'output nel formato richiesto
            // Gioco: {GameName}
            // Giocatore: {Username}, Punteggio: {Score}
            // Giocatore: {Username}, Punteggio: {Score}
            // Total Players: {TotalPlayers}
        }
    }
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore C# online