Kursinhalt
C# Über die Grundlagen Hinaus
C# Über die Grundlagen Hinaus
Das `static` Schlüsselwort
index
using System; class ConsoleApp { static int val = 10; static void Main() { Console.WriteLine($"The value is {val}"); } }
Es war damals eine bequeme Möglichkeit, das static
Schlüsselwort zu beschreiben, da erwartet wurde, dass der Leser zu diesem Zeitpunkt möglicherweise keine Kenntnisse über Objekte oder Klassen hat. Wenn Sie sich jedoch jetzt den Code ansehen, werden Sie feststellen, dass val
im Grunde ein Feld der ConsoleApp
Klasse ist. Beachten Sie jedoch, dass die ConsoleApp
Klasse sich leicht von den Klassen unterscheidet, die wir normalerweise erstellen. Das liegt daran, dass ConsoleApp
das Programm selbst darstellt und es kein Objekt der ConsoleApp
gibt. Wir werden auf diesen Teil gleich zurückkommen.
Da eine Klasse nur ein Bauplan ist, eher wie eine hohle Schale, enthält sie normalerweise keine Daten von sich aus. Stattdessen erstellen wir Objekte mit diesem Bauplan und speichern und greifen dann auf Daten von diesen Objekten zu - wie zuvor erklärt:
index
using System; class Complex { public int real; public int img; public Complex(int real, int img) { this.real = real; this.img = img; } } class ConsoleApp { static int val = 10; static void Main() { Complex c = new Complex(5, 10); // We can use and update the field of 'c' which is an instance. Console.WriteLine(c.real); c.real = 7; Console.WriteLine(c.real); } }
Selbst innerhalb einer Klasse, wenn wir auf diese Felder zugreifen, tun wir dies über ein Objekt. Zum Beispiel in einem Konstruktor verwenden wir im Grunde die Daten, die von dem Objekt übergeben wurden, das die Konstruktormethode aufgerufen hat:
index
public Complex(int real, int img) { // 'int real' and 'int img' contain the data which was passed // 'this.real' refers to the 'real' field of the object which is calling this constructor // same is the case for 'this.img' this.real = real; this.img = img; }
Ähnlich ist es auch bei anderen Methoden, wenn wir auf Felder zugreifen, greifen wir im Grunde auf die Felder von Objekten zu, die diese Methoden aufrufen, und nicht auf die der Klasse selbst, da die Klasse normalerweise keine Daten enthält.
Es gibt jedoch eine Möglichkeit, Daten direkt in einer Klasse zu speichern und eine Eigenschaft zugänglich zu machen, ohne ein Objekt erstellen zu müssen. Das können wir erreichen, indem wir das Feld oder die Methode einfach static
machen:
index
using System; class Complex { public int real; public int img; // A static field can contain data // It is set to private because we don't want it to be manually modifiable from outside // This will track the total number of 'Complex' objects created private static int numbers = 0; public Complex(int real, int img) { this.real = real; this.img = img; numbers += 1; } // A static method // A static method or field can be accessed using the 'ClassName.PropertyName' syntax (see below) public static int getTotalComplexNumbers() { return numbers; } } class ConsoleApp { static void Main() { Console.WriteLine(Complex.getTotalComplexNumbers()); // 0 new Complex(1, 2); Console.WriteLine(Complex.getTotalComplexNumbers()); // 1 new Complex(2, 3); Console.WriteLine(Complex.getTotalComplexNumbers()); // 2 } }
Da die ConsoleApp
oder die Hauptklasse eines Programms, das das Programm selbst darstellt, keine Objekte haben kann, müssen wir ihre Methoden und Felder statisch machen. Deshalb ist die Main
-Methode ebenfalls static
:
index
static void Main() { // code }
1. Kann eine Klasse direkt Daten speichern?
2. Was ist die korrekte Syntax, um das value
-Feld zu ändern?
Danke für Ihr Feedback!