static (C#-Referenz)

Auf dieser Seite wird das Modifiziererschlüsselwort static behandelt. Das Schlüsselwort static ist auch Teil der using static-Anweisung.

Verwenden Sie den Modifizierer static, um einen statischen Member zu deklarieren, der zum Typ selbst gehört, anstatt zu einem bestimmten Objekt. Der static-Modifizierer kann zum Deklarieren von static-Klassen verwendet werden. In Klassen, Schnittstellen und Strukturen können Sie den Modifizierer static zu Feldern, Methoden, Eigenschaften, Operatoren, Ereignissen und Konstruktoren hinzufügen. Der static-Modifizierer kann nicht mit Indexern oder Finalizern verwendet werden. Weitere Informationen finden Sie unter Statische Klassen und statische Klassenmember.

Ab C# 8.0 können Sie den static-Modifizierer zu einer lokalen Funktion hinzufügen. Eine statische lokale Funktion kann keine lokalen Variablen oder den Instanzzustand erfassen.

Ab C# 9.0 können Sie Lambdaausdrücken oder anonymen Methoden den static-Modifizierer hinzufügen. Eine statische Lambda- oder anonyme Methode kann keine lokalen Variablen bzw. keinen Instanzzustand erfassen.

Beispiel: statische Klasse

Die folgende Klasse wird als static deklariert und enthält nur static-Methoden:

static class CompanyEmployee
{
    public static void DoSomething() { /*...*/ }
    public static void DoSomethingElse() { /*...*/  }
}

Eine Konstante oder Typdeklaration ist implizit ein static-Member. Ein static-Member kann nicht über eine Instanz verwiesen werden. Stattdessen wird er über den Typnamen verwiesen. Betrachten Sie beispielsweise die folgende Klasse:

public class MyBaseC
{
    public struct MyStruct
    {
        public static int x = 100;
    }
}

Verwenden Sie zum Verweisen auf einen static-Member x den vollqualifizierten Namen MyBaseC.MyStruct.x, außer es kann auf den Member vom selben Geltungsbereich zugegriffen werden:

Console.WriteLine(MyBaseC.MyStruct.x);

Während die Instanz einer Klasse eine separate Kopie aller Instanzfelder der Klasse enthält, gibt es nur eine Kopie von jedem static-Feld.

Es ist nicht möglich, this zum Verweis auf static-Methoden oder Eigenschaftenaccessoren zu verwenden.

Wenn das Schlüsselwort static auf eine Klasse angewandt wird, müssen alle Member der Klasse static sein.

Klassen, Schnittstellen und static-Klassen können static-Konstruktoren haben. Ein static-Konstruktor wird irgendwann zwischen Programmstart und Klasseninstanziierung aufgerufen.

Hinweis

Die Verwendung des Schlüsselworts static ist in C# eingeschränkter als in C++. Vergleiche mit dem C++-Schlüsselwort finden Sie unter Speicherklassen (C++).

Stellen Sie sich zur Veranschaulichung von static-Membern eine Klasse vor, die einen Angestellten eines Unternehmens darstellt. Es wird angenommen, dass die Klasse eine Methode zum Zählen von Angestellten sowie ein Feld enthält, in dem die Anzahl von Angestellten gespeichert wird. Sowohl die Methode als auch das Feld gehören nicht zu einer Instanz eines Angestellten. Stattdessen gehören diese zur Klasse der Angestellten als Ganzes. Diese sollten als static-Member der Klasse deklariert werden.

Beispiel: statisches Feld und statische Methode

In diesem Beispiel wird der Name und die ID eines neuen Angestellten gelesen, der Angestelltenzähler wird um 1 erhöht, und die Informationen zum neuen Angestellten sowie die neue Anzahl von Angestellten wird angezeigt. Das Programm liest die aktuelle Anzahl von Angestellten von der Tastatur.

public class Employee4
{
    public string id;
    public string name;

    public Employee4()
    {
    }

    public Employee4(string name, string id)
    {
        this.name = name;
        this.id = id;
    }

    public static int employeeCounter;

    public static int AddEmployee()
    {
        return ++employeeCounter;
    }
}

class MainClass : Employee4
{
    static void Main()
    {
        Console.Write("Enter the employee's name: ");
        string name = Console.ReadLine();
        Console.Write("Enter the employee's ID: ");
        string id = Console.ReadLine();

        // Create and configure the employee object.
        Employee4 e = new Employee4(name, id);
        Console.Write("Enter the current number of employees: ");
        string n = Console.ReadLine();
        Employee4.employeeCounter = Int32.Parse(n);
        Employee4.AddEmployee();

        // Display the new information.
        Console.WriteLine($"Name: {e.name}");
        Console.WriteLine($"ID:   {e.id}");
        Console.WriteLine($"New Number of Employees: {Employee4.employeeCounter}");
    }
}
/*
Input:
Matthias Berndt
AF643G
15
 *
Sample Output:
Enter the employee's name: Matthias Berndt
Enter the employee's ID: AF643G
Enter the current number of employees: 15
Name: Matthias Berndt
ID:   AF643G
New Number of Employees: 16
*/

Beispiel: statische Initialisierung

Dieses Beispiel zeigt, dass Sie ein static-Feld durch Verwendung eines anderen static-Felds initialisieren können, das noch nicht deklariert ist. Die Ergebnisse sind undefiniert, bis Sie dem Feld static explizit einen Wert zuweisen.

class Test
{
    static int x = y;
    static int y = 5;

    static void Main()
    {
        Console.WriteLine(Test.x);
        Console.WriteLine(Test.y);

        Test.x = 99;
        Console.WriteLine(Test.x);
    }
}
/*
Output:
    0
    5
    99
*/

C#-Sprachspezifikation

Weitere Informationen erhalten Sie unter C#-Sprachspezifikation. Die Sprachspezifikation ist die verbindliche Quelle für die Syntax und Verwendung von C#.

Siehe auch