Menu
Coddy logo textTech

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.

challenge icon

Aufgabe

Einfach

Lassen 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 eine Player-Klasse im Namespace GameSession. Jeder Spieler hat seinen eigenen Username (string) und Score (int) - diese sind für jeden Spieler einzigartig. Die Klasse sollte auch Informationen verfolgen, die für alle Spieler gelten: ein statisches Feld GameName (string), das den Namen des Spiels speichert, das alle spielen, und ein statisches Feld TotalPlayers (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 Methode SetGameName(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}
        }
    }
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung