static (C#-Referenz)static (C# Reference)

Auf dieser Seite wird das Modifiziererschlüsselwort static behandelt.This page covers the static modifier keyword. Das Schlüsselwort static ist auch Teil der using static-Anweisung.The static keyword is also part of the using static directive.

Verwenden Sie den Modifizierer static, um einen statischen Member zu deklarieren, der zum Typ selbst gehört, anstatt zu einem bestimmten Objekt.Use the static modifier to declare a static member, which belongs to the type itself rather than to a specific object. Der static-Modifizierer kann zum Deklarieren von static-Klassen verwendet werden.The static modifier can be used to declare static classes. In Klassen, Schnittstellen und Strukturen können Sie den Modifizierer static zu Feldern, Methoden, Eigenschaften, Operatoren, Ereignissen und Konstruktoren hinzufügen.In classes, interfaces, and structs, you may add the static modifier to fields, methods, properties, operators, events, and constructors. Der static-Modifizierer kann nicht mit Indexern oder Finalizern verwendet werden.The static modifier can't be used with indexers or finalizers. Weitere Informationen finden Sie unter Statische Klassen und statische Klassenmember.For more information, see Static Classes and Static Class Members.

Ab C# 8.0 können Sie den static-Modifizierer zu einer lokalen Funktion hinzufügen.Beginning with C# 8.0, you can add the static modifier to a local function. Eine statische lokale Funktion kann keine lokalen Variablen oder den Instanzzustand erfassen.A static local function can't capture local variables or instance state.

Ab C# 9.0 können Sie Lambdaausdrücken oder anonymen Methoden den static-Modifizierer hinzufügen.Beginning with C# 9.0, you can add the static modifier to a lambda expression or anonymous method. Eine statische Lambda- oder anonyme Methode kann keine lokalen Variablen bzw. keinen Instanzzustand erfassen.A static lambda or anonymous method can't capture local variables or instance state.

Beispiel: statische KlasseExample - static class

Die folgende Klasse wird als static deklariert und enthält nur static-Methoden:The following class is declared as static and contains only static methods:

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

Eine Konstante oder Typdeklaration ist implizit ein static-Member.A constant or type declaration is implicitly a static member. Ein static-Member kann nicht über eine Instanz verwiesen werden.A static member can't be referenced through an instance. Stattdessen wird er über den Typnamen verwiesen.Instead, it's referenced through the type name. Betrachten Sie beispielsweise die folgende Klasse:For example, consider the following class:

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:To refer to the static member x, use the fully qualified name, MyBaseC.MyStruct.x, unless the member is accessible from the same scope:

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.While an instance of a class contains a separate copy of all instance fields of the class, there's only one copy of each static field.

Es ist nicht möglich, this zum Verweis auf static-Methoden oder Eigenschaftenaccessoren zu verwenden.It isn't possible to use this to reference static methods or property accessors.

Wenn das Schlüsselwort static auf eine Klasse angewandt wird, müssen alle Member der Klasse static sein.If the static keyword is applied to a class, all the members of the class must be static.

Klassen, Schnittstellen und static-Klassen können static-Konstruktoren haben.Classes, interfaces, and static classes may have static constructors. Ein static-Konstruktor wird irgendwann zwischen Programmstart und Klasseninstanziierung aufgerufen.A static constructor is called at some point between when the program starts and the class is instantiated.

Hinweis

Die Verwendung des Schlüsselworts static ist in C# eingeschränkter als in C++.The static keyword has more limited uses than in C++. Vergleiche mit dem C++-Schlüsselwort finden Sie unter Speicherklassen (C++).To compare with the C++ keyword, see Storage classes (C++).

Stellen Sie sich zur Veranschaulichung von static-Membern eine Klasse vor, die einen Angestellten eines Unternehmens darstellt.To demonstrate static members, consider a class that represents a company employee. 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.Assume that the class contains a method to count employees and a field to store the number of employees. Sowohl die Methode als auch das Feld gehören nicht zu einer Instanz eines Angestellten.Both the method and the field don't belong to any one employee instance. Stattdessen gehören diese zur Klasse der Angestellten als Ganzes.Instead, they belong to the class of employees as a whole. Diese sollten als static-Member der Klasse deklariert werden.They should be declared as static members of the class.

Beispiel: statisches Feld und statische MethodeExample - static field and method

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.This example reads the name and ID of a new employee, increments the employee counter by one, and displays the information for the new employee and the new number of employees. Das Programm liest die aktuelle Anzahl von Angestellten von der Tastatur.This program reads the current number of employees from the keyboard.

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 InitialisierungExample - static initialization

Dieses Beispiel zeigt, dass Sie ein static-Feld durch Verwendung eines anderen static-Felds initialisieren können, das noch nicht deklariert ist.This example shows that you can initialize a static field by using another static field that is not yet declared. Die Ergebnisse sind undefiniert, bis Sie dem Feld static explizit einen Wert zuweisen.The results will be undefined until you explicitly assign a value to the static field.

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#-SprachspezifikationC# language specification

Weitere Informationen erhalten Sie unter C#-Sprachspezifikation.For more information, see the C# Language Specification. Die Sprachspezifikation ist die verbindliche Quelle für die Syntax und Verwendung von C#.The language specification is the definitive source for C# syntax and usage.

Siehe auchSee also