Statische Felder & Methoden
Teil des Abschnitts Objektorientierte Programmierung der C#-Journey von Coddy — Lektion 12 von 70.
Bisher gehörte jedes Feld und jede Methode, die wir erstellt haben, zu einzelnen Objekten. Aber manchmal benötigt man Daten oder Verhalten, die zur Klasse selbst gehören und von allen Instanzen geteilt werden. Hier kommt das Schlüsselwort static ins Spiel.
Ein statisches Feld wird von allen Objekten einer Klasse gemeinsam genutzt. Es gibt nur eine Kopie, unabhängig davon, wie viele Instanzen Sie erstellen:
public class Player
{
public static int TotalPlayers = 0;
public string Name { get; set; }
public Player(string name)
{
Name = name;
TotalPlayers++;
}
}Jedes Mal, wenn ein neuer Player erstellt wird, erhöht sich TotalPlayers. Alle Spieler teilen sich diesen selben Zähler.
Eine statische Methode gehört zur Klasse und kann aufgerufen werden, ohne ein Objekt zu erstellen:
public class Calculator
{
public static int Add(int a, int b)
{
return a + b;
}
}
// Wird auf der Klasse aufgerufen, nicht auf einer Instanz
int result = Calculator.Add(5, 3);Beachten Sie, dass Sie auf statische Member über den Klassennamen zugreifen und nicht über eine Objektreferenz. Statische Methoden können nicht auf Instanzfelder zugreifen oder this verwenden, da sie zu keinem bestimmten Objekt gehören.
Sie haben bereits statische Member verwendet, ohne es zu merken. Console.WriteLine() ist eine statische Methode und Math.PI ist ein statisches Feld.
Aufgabe
EinfachLassen Sie uns ein Auftragsverfolgungssystem erstellen, das statische Member verwendet, um alle in Ihrer Anwendung aufgegebenen Bestellungen zu verfolgen.
Sie werden zwei Dateien erstellen, um Ihren Code zu organisieren:
Order.cs: Definieren Sie eineOrder-Klasse im NamespaceOrderSystem. Jede Bestellung sollte eine InstanzeigenschaftOrderId(int) undCustomerName(string) haben. Die Klasse sollte außerdem die Gesamtzahl der erstellten Bestellungen mithilfe eines statischen FeldesTotalOrdersverfolgen und eine statische MethodeGetNextOrderId()bereitstellen, die die nächste verfügbare Bestell-ID (beginnend bei 1) zurückgibt. Der Konstruktor sollte einen Kundennamen akzeptieren, die Bestell-ID automatisch mithilfe der statischen Methode zuweisen und den Gesamtzähler der Bestellungen erhöhen.Program.cs: Erstellen Sie in Ihrer Hauptdatei Bestellungen basierend auf der Eingabe und zeigen Sie deren Details zusammen mit der Gesamtzahl der Bestellungen an.
Sie erhalten zwei Eingaben, die Kundennamen für zwei separate Bestellungen darstellen.
Geben Sie für jede Bestellung die Details in diesem Format aus:
Order #{OrderId} - Customer: {CustomerName}Geben Sie nach dem Erstellen beider Bestellungen die Gesamtzahl aus:
Total Orders: {TotalOrders}Wenn die Eingaben beispielsweise Alice und Bob sind, sollte die Ausgabe wie folgt aussehen:
Order #1 - Customer: Alice
Order #2 - Customer: Bob
Total Orders: 2Spickzettel
Das Schlüsselwort static erstellt Member, die zur Klasse selbst gehören und nicht zu einzelnen Instanzen.
Statische Felder werden von allen Objekten einer Klasse gemeinsam genutzt. Es existiert nur eine einzige Kopie, unabhängig davon, wie viele Instanzen erstellt werden:
public class Player
{
public static int TotalPlayers = 0;
public string Name { get; set; }
public Player(string name)
{
Name = name;
TotalPlayers++;
}
}Statische Methoden gehören zur Klasse und können aufgerufen werden, ohne ein Objekt zu erstellen:
public class Calculator
{
public static int Add(int a, int b)
{
return a + b;
}
}
// Wird auf der Klasse aufgerufen, nicht auf einer Instanz
int result = Calculator.Add(5, 3);Auf statische Member wird über den Klassennamen zugegriffen, nicht über eine Objektreferenz. Statische Methoden können nicht auf Instanzfelder zugreifen oder this verwenden, da sie zu keinem spezifischen Objekt gehören.
Häufige Beispiele für statische Member sind Console.WriteLine() (statische Methode) und Math.PI (statisches Feld).
Probier es selbst
using System;
using OrderSystem;
class Program
{
public static void Main(string[] args)
{
// Kundennamen lesen
string customer1 = Console.ReadLine();
string customer2 = Console.ReadLine();
// TODO: Erstellen Sie zwei Order-Objekte mit den Kundennamen
// TODO: Geben Sie die Details jeder Bestellung im folgenden Format aus:
// Order #{OrderId} - Customer: {CustomerName}
// TODO: Geben Sie die Gesamtzahl der Bestellungen im folgenden Format aus:
// Total Orders: {TotalOrders}
}
}
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