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.
Sfida
FacileCostruiamo 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 classePlayernello spazio dei nomiGameSession. Ogni giocatore ha il proprioUsername(stringa) eScore(int), univoci per ciascun giocatore. La classe deve anche tenere traccia delle informazioni che riguardano tutti i giocatori: un campo staticoGameName(stringa) che memorizza il nome della partita a cui stanno giocando tutti e un campo staticoTotalPlayers(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 staticoSetGameName(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: 2Rifletti 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}
}
}
}
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
1Fondamenti della programmazione orientata agli oggetti
File esterniNamespace e direttiveIntroduzione a classi e oggettiLa parola chiave "this"Metodi e parametriCampi e proprietàCostruttoriInizializzatori di oggettiRiepilogo - Calcolatrice semplice4Ereditarietà
Sintassi di base dell'ereditarietà (:)La parola chiave 'base'Parole chiave virtual e overrideClassi sealedLa classe base 'object'Riepilogo - Gerarchia dei dipendenti7Funzionalità avanzate
Sovraccarico degli operatoriIndicizzatori (this[])Override di ToString()Metodi di estensioneRiepilogo - Lista personalizzata10Pattern di progettazione Parte 1
Introduzione ai pattern di progettazioneSingleton thread-safePattern FactoryPattern Observer (eventi)Pattern Strategy2Proprietà e membri statici
Proprietà implementate automaticamenteProprietà di sola lettura e di sola scritturaCampi e metodi staticiClassi staticheMembri con corpo di espressione5Polimorfismo e interfacce
Polimorfismo a compile time e runtimeInterfaccia o classe astrattaInterfacce multipleInterfacce espliciteUpcasting e downcastingRipasso: calcolatore di forme8Concetti avanzati di programmazione a oggetti
Composizione invece dell'ereditarietàTipi generici (classi e metodi)Delegati ed eventiAttributi e reflectionIDisposable e istruzione usingNozioni di base sull'iniezione delle dipendenze11Pattern di progettazione, parte 2
Pattern del ComandoPattern dell’AdattatorePattern del DecoratorePattern Template MethodPattern dello StatoPattern Composito3Architettura delle classi
Dati di istanza vs staticiParole chiave 'readonly' e 'const'Campi di supportoRiepilogo - Gestore di conti bancari6Incapsulamento
Modificatori di accessoProprietà per l'incapsulamentoImplementazione dell'occultamento dei datiModelli di immutabilitàRiepilogo - Registri degli studentiEsercitati da solo: Compilatore C# online