static (C#-Referenz)

Aktualisiert: November 2007

Mit dem static-Modifizierer kann ein statischer Member deklariert werden, der zum Typ selbst und nicht zu einem bestimmten Objekt gehört. Der static-Modifizierer kann bei Klassen, Feldern, Methoden, Eigenschaften, Operatoren, Ereignissen und Konstruktoren verwendet werden, jedoch nicht bei Indexern, Destruktoren oder Typen, die keine Klassen sind. Weitere Informationen hierzu finden Sie unter Statische Klassen und statische Klassenmember (C#-Programmierhandbuch).

Beispiel

Die folgende Klasse ist zum Beispiel als static deklariert und enthält nur static-Methoden:

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

Eine Konstanten- oder Typdeklaration stellt implizit einen Member des Typs static dar.

Auf einen Member vom Typ static darf nicht über eine Instanz verwiesen werden. Stattdessen geschieht dies über den Typnamen. Betrachten Sie z. B. die folgende Klasse:

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

Verwenden Sie zum Verweisen auf den Member des Typs static, x, den vollqualifizierten Namen, es sei denn, er ist vom selben Bereich aus zugreifbar:

MyBaseC.MyStruct.x

Während die Instanz einer Klasse eine separate Kopie aller Instanzenfelder der Klasse enthält, ist lediglich eine Kopie jedes statischen Felds vorhanden.

this kann nicht zum Verweisen auf statische Methoden oder Eigenschaftenaccessoren verwendet werden.

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

Klassen und statische Klassen können möglicherweise über statische Konstruktoren verfügen. Statische Konstruktoren werden irgendwann zwischen dem Programmstart und der Klasseninstanziierung aufgerufen.

Hinweis:

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

Betrachten Sie zur Demonstration von statischen Membern eine Klasse, die einen Firmenangestellten repräsentiert. Nehmen Sie an, dass die Klasse eine Methode zum Zählen der Angestellten und ein Feld zum Speichern der Angestelltenzahl enthält. Weder die Methode noch das Feld sind Elemente einer Angestellteninstanz. Stattdessen gehören sie zur Klasse. Daher sollten sie als Member des Typs static der Klasse deklariert werden.

In diesem Beispiel werden der Name und die ID eines neuen Angestellten eingelesen, der Angestelltenzähler wird um eins erhöht, und die Informationen für den neuen Angestellten sowie die neue Angestelltenzahl werden angezeigt. Der Einfachheit halber wird bei diesem Beispiel die Angestelltenzahl über die Tastatur eingegeben. In einer realen Anwendung sollten diese Informationen jedoch aus einer Datei eingelesen werden.

    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: {0}", e.name);
        Console.WriteLine("ID:   {0}", e.id);
        Console.WriteLine("New Number of Employees: {0}",
                      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
    */

Dieses Beispiel zeigt, dass es zwar möglich ist, ein statisches Feld mit einem anderen statischen, noch nicht deklarierten Feld zu initialisieren, dass die Ergebnisse jedoch undefiniert bleiben, solange dem statischen Feld nicht explizit ein Wert zugewiesen wird.

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#-Programmiersprachenspezifikation

Weitere Informationen finden Sie in den folgenden Abschnitten von C#-Programmiersprachenspezifikation:

  • 1.6.6.3 Statische und Instanzmethoden

  • 5.1.1 Statische Variablen

  • 10.3.7 Statische und Instanzmember

  • 10.5.1 Statische Felder und Instanzfelder

  • 10.5.5.1 Initialisierung statischer Felder

  • 10.6.2 Statische und Instanzmethoden

  • 10.7.1 Statische und Instanzeigenschaften

  • 10.8.3 Statische und Instanzereignisse

  • 10.12 Statische Konstruktoren

Siehe auch

Konzepte

C#-Programmierhandbuch

Referenz

C#-Schlüsselwörter

Modifizierer (C#-Referenz)

Statische Klassen und statische Klassenmember (C#-Programmierhandbuch)

Weitere Ressourcen

C#-Referenz