Instanz- vs. statische Daten
Teil des Abschnitts Objektorientierte Programmierung der C#-Journey von Coddy — Lektion 15 von 70.
Nachdem Sie nun statische Member verstehen, lassen Sie uns klären, wann Instanzdaten im Gegensatz zu statischen Daten verwendet werden sollten. Diese Entscheidung beeinflusst, wie Ihre Klasse Informationen speichert und teilt.
Instanzdaten gehören zu jedem Objekt einzeln. Jedes Objekt erhält seine eigene Kopie, und Änderungen an einem Objekt wirken sich nicht auf andere aus:
public class BankAccount
{
public string Owner { get; set; } // Instanz - eindeutig pro Konto
public decimal Balance { get; set; } // Instanz - eindeutig pro Konto
}Jedes BankAccount hat seinen eigenen Besitzer und Kontostand. Das ergibt Sinn, da verschiedene Konten unterschiedliche Beträge für verschiedene Personen enthalten.
Statische Daten gehören zur Klasse selbst und werden von allen Instanzen gemeinsam genutzt:
public class BankAccount
{
public static decimal InterestRate = 0.05m; // Statisch - gleich für alle
public static int TotalAccounts = 0; // Statisch - verfolgt alle Konten
public string Owner { get; set; }
public decimal Balance { get; set; }
}Der Zinssatz gilt gleichermaßen für jedes Konto, daher ist die Verwendung von static sinnvoll. Der Gesamtkontozähler verfolgt klassenweite Informationen, keine individuellen Kontodaten.
Eine einfache Regel: Wenn die Daten ein bestimmtes Objekt beschreiben, machen Sie sie zu instance. Wenn sie die Klasse als Ganzes beschreiben oder geteilt werden sollen, machen Sie sie static. Eine falsche Mischung führt zu Fehlern, bei denen sich Daten unerwartet über Objekte hinweg ändern oder nicht zugänglich sind, wenn sie benötigt werden.
Aufgabe
EinfachLassen Sie uns einen Spielsitzungs-Tracker erstellen, der den Unterschied zwischen Daten, die einzelnen Spielern gehören, und Daten, die im gesamten Spiel geteilt werden, verdeutlicht.
Sie werden zwei Dateien erstellen, um Ihren Code zu organisieren:
Player.cs: Definieren Sie einePlayer-Klasse im NamespaceGameSession. Jeder Spieler hat seinen eigenenUsername(string) undScore(int) - diese sind für jeden Spieler einzigartig. Die Klasse sollte auch Informationen verfolgen, die für alle Spieler gelten: ein statisches FeldGameName(string), das den Namen des Spiels speichert, das alle spielen, und ein statisches FeldTotalPlayers(int), das zählt, wie viele Spieler beigetreten sind. Fügen Sie einen Konstruktor hinzu, der den Benutzernamen und die Startpunktzahl entgegennimmt und automatisch die Gesamtzahl der Spieler erhöht. Fügen Sie eine statische MethodeSetGameName(string name)hinzu, um den Spielnamen zu konfigurieren.Program.cs: Richten Sie in Ihrer Hauptdatei das Spiel ein und erstellen Sie Spieler basierend auf der Eingabe. Legen Sie zuerst den Spielnamen fest, erstellen Sie dann zwei Spieler und zeigen Sie deren individuelle Informationen zusammen mit den geteilten Spieldaten an.
Sie erhalten fünf Eingaben:
- Den Spielnamen
- Den Benutzernamen des ersten Spielers
- Die Startpunktzahl des ersten Spielers
- Den Benutzernamen des zweiten Spielers
- Die Startpunktzahl des zweiten Spielers
Geben Sie die Ausgabe in diesem Format aus:
Game: {GameName}
Player: {Username}, Score: {Score}
Player: {Username}, Score: {Score}
Total Players: {TotalPlayers}Wenn die Eingaben beispielsweise BattleArena, DragonSlayer, 1500, ShadowNinja und 2200 sind, sollte die Ausgabe wie folgt aussehen:
Game: BattleArena
Player: DragonSlayer, Score: 1500
Player: ShadowNinja, Score: 2200
Total Players: 2Überlegen Sie genau, welche Daten instanzbasiert (für jeden Spieler unterschiedlich) und welche statisch (für alle Spieler gemeinsam) sein sollten. Der Spielname und die Gesamtzahl der Spieler beschreiben die Sitzung als Ganzes, während Benutzername und Punktzahl für jedes Individuum einzigartig sind.
Spickzettel
Verwenden Sie Instanzdaten für Eigenschaften, die für jedes Objekt eindeutig sind:
public class BankAccount
{
public string Owner { get; set; } // Jedes Konto hat seinen eigenen Besitzer
public decimal Balance { get; set; } // Jedes Konto hat seinen eigenen Kontostand
}Verwenden Sie statische Daten für Eigenschaften, die von allen Instanzen einer Klasse gemeinsam genutzt werden:
public class BankAccount
{
public static decimal InterestRate = 0.05m; // Gleich für alle Konten
public static int TotalAccounts = 0; // Verfolgt alle Konten
public string Owner { get; set; }
public decimal Balance { get; set; }
}Entscheidungsregel: Wenn die Daten ein bestimmtes Objekt beschreiben, verwenden Sie Instanzdaten. Wenn sie die Klasse als Ganzes beschreiben oder gemeinsam genutzt werden sollen, verwenden Sie statische Daten.
Probier es selbst
using System;
namespace GameSession
{
class Program
{
public static void Main(string[] args)
{
// Eingaben lesen
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: Den Spielnamen mit der statischen Methode festlegen
// TODO: Zwei Player-Objekte mit den Eingabedaten erstellen
// TODO: Die Ausgabe im erforderlichen Format ausgeben
// Spiel: {GameName}
// Spieler: {Username}, Score: {Score}
// Spieler: {Username}, Score: {Score}
// Spieler insgesamt: {TotalPlayers}
}
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienNamespaces & DirektivenEinführung in Klassen & ObjekteDas 'this'-SchlüsselwortMethoden und ParameterFelder vs. EigenschaftenKonstruktorenObjekt-InitialisiererZusammenfassung - Einfacher Taschenrechner4Vererbung
Grundlagen der Vererbung (:) SyntaxDas 'base'-SchlüsselwortVirtual & Override SchlüsselwörterVersiegelte KlassenDie 'object'-BasisklasseZusammenfassung – Mitarbeiter-Hierarchie7Fortgeschrittene Funktionen
OperatorüberladungIndexer (this[])ToString() überschreibenErweiterungsmethodenZusammenfassung - Benutzerdefinierte Liste2Eigenschaften & Statische Member
Automatisch implementierte EigenschaftenRead-Only- & Write-Only-EigenschaftenStatische Felder & MethodenStatische KlassenExpression-Bodied Member5Polymorphismus & Interfaces
Compile- vs. Runtime-PolymorphismusInterface vs. abstrakte KlasseMehrfache InterfacesExplizite InterfacesUpcasting & DowncastingRecap – Shape Calculator3Klassenarchitektur
Instanz- vs. statische Daten'readonly' & 'const' SchlüsselwörterBacking FieldsZusammenfassung - Bankkonto-Manager6Kapselung
ZugriffsmodifikatorenProperties zur KapselungImplementierung von Data HidingImmutability-MusterRückblick – Studierendendaten