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 für jedes Konto gleichermaßen, daher ist es sinnvoll, ihn als statisch zu definieren. Der Gesamtkontenzähler erfasst klassenweite Informationen und keine Daten einzelner Konten.
Eine einfache Regel: Wenn die Daten ein bestimmtes Objekt beschreiben, mache sie zu Instanzdaten. Wenn sie die Klasse als Ganzes beschreiben oder gemeinsam genutzt werden sollen, mache sie statisch. Eine falsche Vermischung führt zu Fehlern, bei denen sich Daten unerwartet über Objekte hinweg ändern oder bei Bedarf nicht zugänglich sind.
Aufgabe
EinfachErstellen wir einen Spiel-Session-Tracker, der den Unterschied zwischen Daten veranschaulicht, die zu einzelnen Spielern gehören, und Daten, die im gesamten Spiel gemeinsam genutzt werden.
Du wirst zwei Dateien erstellen, um deinen Code zu organisieren:
Player.cs: Definiere einePlayer-Klasse imGameSession-Namespace. Jeder Spieler hat seinen eigenenUsername(string) undScore(int) – diese sind für jeden Spieler einzigartig. Die Klasse soll außerdem Informationen erfassen, 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üge einen Konstruktor hinzu, der den Benutzernamen und den Anfangspunktestand entgegennimmt und die Gesamtzahl der Spieler automatisch erhöht. Füge eine statische MethodeSetGameName(string name)hinzu, um den Spielnamen festzulegen.Program.cs: Richte in deiner Hauptdatei das Spiel ein und erstelle Spieler basierend auf den Eingaben. Lege zuerst den Spielnamen fest, erstelle dann zwei Spieler und zeige ihre individuellen Informationen zusammen mit den gemeinsamen Spieldaten an.
Du erhältst fünf Eingaben:
- Der Spielname
- Der Benutzername des ersten Spielers
- Der Anfangspunktestand des ersten Spielers
- Der Benutzername des zweiten Spielers
- Der Anfangspunktestand des zweiten Spielers
Gib 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 lauten, sollte die Ausgabe wie folgt aussehen:
Game: BattleArena
Player: DragonSlayer, Score: 1500
Player: ShadowNinja, Score: 2200
Total Players: 2Überlege sorgfältig, welche Daten instanzbasiert sein sollten (für jeden Spieler unterschiedlich) und welche statisch sein sollten (für alle Spieler gemeinsam). Der Spielname und die Gesamtzahl der Spieler beschreiben die Sitzung als Ganzes, während Benutzername und Punktestand für jeden einzelnen Spieler einzigartig sind.
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}
// Total Players: {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. EigenschaftenKonstruktorenObjektinitialisiererWiederholung – Einfacher Taschenrechner4Vererbung
Grundlegende Vererbungs-(:)-SyntaxDas „base“-Schlüsselwort„virtual“- und „override“-SchlüsselwörterVersiegelte KlassenDie „object“-BasisklasseWiederholung – Mitarbeiterhierarchie7Erweiterte Funktionen
Überladen von OperatorenIndexer (this[])ToString()-ÜberschreibungErweiterungsmethodenRückblick – Benutzerdefinierte Liste10Entwurfsmuster Teil 1
Einführung in EntwurfsmusterThread-sicheres SingletonFactory-MusterObserver-Muster (Events)Strategy-Muster13Abschließende Herausforderungen
E-Learning-PlattformKomponente für SpielfigurenFahrzeugvermietungsdienst2Eigenschaften & statische Member
Automatisch implementierte EigenschaftenNur lesbare/schreibbare EigenschaftenStatische Felder & MethodenStatische KlassenMember mit Ausdruckskörpern5Polymorphie & Interfaces
Compile- vs. Laufzeit-PolymorphieInterface vs. abstrakte KlasseMehrere InterfacesExplizite InterfacesUpcasting & DowncastingWiederholung – Formenrechner3Klassenarchitektur
Instanz- vs. statische DatenSchlüsselwörter 'readonly' & 'const'Backing FieldsRückblick – Bankkontenverwaltung6Kapselung
ZugriffsmodifikatorenEigenschaften zur KapselungImplementierung der DatenkapselungMuster für UnveränderlichkeitRückblick – SchülerdatenÜbe selbstständig: Online-C#-Compiler