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 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.

challenge icon

Aufgabe

Einfach

Erstellen 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 eine Player-Klasse im GameSession-Namespace. Jeder Spieler hat seinen eigenen Username (string) und Score (int) – diese sind für jeden Spieler einzigartig. Die Klasse soll außerdem Informationen erfassen, 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üge einen Konstruktor hinzu, der den Benutzernamen und den Anfangspunktestand entgegennimmt und die Gesamtzahl der Spieler automatisch erhöht. Füge eine statische Methode SetGameName(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}
        }
    }
}
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

Übe selbstständig: Online-C#-Compiler