Statische Klassen und statische Klassenmember (C#-Programmierhandbuch)Static Classes and Static Class Members (C# Programming Guide)

Eine statische Klasse ist im Grunde identisch mit einer nicht statischen Klasse, aber es gibt einen Unterschied: Eine statische Klasse kann nicht instanziiert werden.A static class is basically the same as a non-static class, but there is one difference: a static class cannot be instantiated. Das heißt, Sie können das Schlüsselwort new nicht verwenden, um eine Variable des Klassentyps zu erstellen.In other words, you cannot use the new keyword to create a variable of the class type. Da keine Instanzvariable vorhanden ist, greifen Sie auf die Member einer statischen Klasse mit dem Klassennamen selbst zu.Because there is no instance variable, you access the members of a static class by using the class name itself. Wenn Sie z.B: eine statische Klasse haben, die UtilityClass heißt, die eine öffentliche Methode mit dem Namen MethodA besitzt, rufen Sie die Methode auf, wie im folgenden Beispiel gezeigt wird:For example, if you have a static class that is named UtilityClass that has a public method named MethodA, you call the method as shown in the following example:

UtilityClass.MethodA();  

Eine statische Klasse kann als geeigneter Container für Reihen von Methoden verwendet werden, die nur Eingabeparameter verarbeiten und keine internen Instanzfelder haben oder festlegen müssen.A static class can be used as a convenient container for sets of methods that just operate on input parameters and do not have to get or set any internal instance fields. In der .NET Framework-Klassenbibliothek enthält z.B. die statische Klasse System.Math Methoden, die mathematische Vorgänge ausführen, ohne dass es notwendig ist, Daten zu speichern oder abzurufen, die in einer bestimmten Instanz der Klasse Math einzigartig sind.For example, in the .NET Framework Class Library, the static System.Math class contains methods that perform mathematical operations, without any requirement to store or retrieve data that is unique to a particular instance of the Math class. Sie wenden also die Member der Klasse an, indem der Klassen- und Methodennamen angegeben wird, wie im folgenden Beispiel gezeigt wird.That is, you apply the members of the class by specifying the class name and the method name, as shown in the following example.

double dub = -3.14;  
Console.WriteLine(Math.Abs(dub));  
Console.WriteLine(Math.Floor(dub));  
Console.WriteLine(Math.Round(Math.Abs(dub)));  

// Output:  
// 3.14  
// -4  
// 3  

Wie auch bei allen Klassentypen werden die Typinformationen für eine statische Klasse von der .NET Framework.NET Framework Common Language Runtime (CLR) geladen, wenn das Programm, das auf die Klasse verweist, geladen wird.As is the case with all class types, the type information for a static class is loaded by the .NET Framework.NET Framework common language runtime (CLR) when the program that references the class is loaded. Das Programm kann nicht genau angeben, wann die Klasse geladen wird.The program cannot specify exactly when the class is loaded. Jedoch wird sichergestellt, dass es geladen wird, und dass seine Felder initialisiert sowie seine statischen Konstruktoren aufgerufen sind, bevor zum ersten Mal auf die Klasse in Ihrem Programm verwiesen wird.However, it is guaranteed to be loaded and to have its fields initialized and its static constructor called before the class is referenced for the first time in your program. Ein statischer Konstruktor wird nur einmal aufgerufen, und eine statische Klasse verbleibt im Speicher für die Lebensdauer der Anwendungsdomäne, in der sich das Programm befindet.A static constructor is only called one time, and a static class remains in memory for the lifetime of the application domain in which your program resides.

Hinweis

Wie Sie eine nicht statische Klasse erstellen, die es erlaubt, dass nur eine Instanz von ihr selbst erstellt wird, finden Sie unter Implementierung von Singleton in C#.To create a non-static class that allows only one instance of itself to be created, see Implementing Singleton in C#.

Die folgende Liste stellt die Haupteigenschaften einer statischen Klasse dar:The following list provides the main features of a static class:

  • Enthält nur statische MemberContains only static members.

  • Kann nicht instanziiert werdenCannot be instantiated.

  • Ist versiegeltIs sealed.

  • Darf keine Instanzkonstruktoren enthaltenCannot contain Instance Constructors.

Daher ist das Erstellen einer statischen Klasse grundsätzlich dasselbe wie das Erstellen einer Klasse, die nur statische Member und einen privaten Konstruktor enthält.Creating a static class is therefore basically the same as creating a class that contains only static members and a private constructor. Ein privater Konstruktor verhindert, dass die Klasse instanziiert wird.A private constructor prevents the class from being instantiated. Der Vorteil bei der Verwendung einer statischen Klasse ist, dass der Compiler überprüfen und dadurch sicherstellen kann, dass keine Instanzmember versehentlich hinzugefügt werden.The advantage of using a static class is that the compiler can check to make sure that no instance members are accidentally added. Der Compiler garantiert, dass Instanzen dieser Klasse nicht erstellt werden können.The compiler will guarantee that instances of this class cannot be created.

Statische Klassen sind versiegelt und können nicht vererbt werden.Static classes are sealed and therefore cannot be inherited. Sie können nur von der Klasse Object erben.They cannot inherit from any class except Object. Statische Klassen können keinen Instanzkonstruktor enthalten. Allerdings können sie einen statischen Konstruktor enthalten.Static classes cannot contain an instance constructor; however, they can contain a static constructor. Nicht statische Klassen sollten auch einen statischen Konstruktor definieren, wenn die Klasse statische Member enthält, die eine nicht triviale Initialisierung erfordern.Non-static classes should also define a static constructor if the class contains static members that require non-trivial initialization. Weitere Informationen finden Sie unter Statische Konstruktoren.For more information, see Static Constructors.

BeispielExample

Dies ist ein Beispiel für eine statische Klasse, die zwei Methoden enthält, die die Temperatur von Grad Celsius in Fahrenheit und umgekehrt konvertieren:Here is an example of a static class that contains two methods that convert temperature from Celsius to Fahrenheit and from Fahrenheit to Celsius:

public static class TemperatureConverter
{
    public static double CelsiusToFahrenheit(string temperatureCelsius)
    {
        // Convert argument to double for calculations.
        double celsius = Double.Parse(temperatureCelsius);

        // Convert Celsius to Fahrenheit.
        double fahrenheit = (celsius * 9 / 5) + 32;

        return fahrenheit;
    }

    public static double FahrenheitToCelsius(string temperatureFahrenheit)
    {
        // Convert argument to double for calculations.
        double fahrenheit = Double.Parse(temperatureFahrenheit);

        // Convert Fahrenheit to Celsius.
        double celsius = (fahrenheit - 32) * 5 / 9;

        return celsius;
    }
}

class TestTemperatureConverter
{
    static void Main()
    {
        Console.WriteLine("Please select the convertor direction");
        Console.WriteLine("1. From Celsius to Fahrenheit.");
        Console.WriteLine("2. From Fahrenheit to Celsius.");
        Console.Write(":");

        string selection = Console.ReadLine();
        double F, C = 0;

        switch (selection)
        {
            case "1":
                Console.Write("Please enter the Celsius temperature: ");
                F = TemperatureConverter.CelsiusToFahrenheit(Console.ReadLine());
                Console.WriteLine("Temperature in Fahrenheit: {0:F2}", F);
                break;

            case "2":
                Console.Write("Please enter the Fahrenheit temperature: ");
                C = TemperatureConverter.FahrenheitToCelsius(Console.ReadLine());
                Console.WriteLine("Temperature in Celsius: {0:F2}", C);
                break;

            default:
                Console.WriteLine("Please select a convertor.");
                break;
        }

        // Keep the console window open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}
/* Example Output:
    Please select the convertor direction
    1. From Celsius to Fahrenheit.
    2. From Fahrenheit to Celsius.
    :2
    Please enter the Fahrenheit temperature: 20
    Temperature in Celsius: -6.67
    Press any key to exit.
 */

Statische MemberStatic Members

Eine nicht statische Klasse kann statische Methoden, Felder, Eigenschaften oder Ereignisse enthalten.A non-static class can contain static methods, fields, properties, or events. Der statische Member ist für eine Klasse aufrufbar, selbst wenn keine Instanz der Klasse erstellt wurde.The static member is callable on a class even when no instance of the class has been created. Auf den statischen Member wird immer vom Klassennamen, nicht vom Namen der Instanz, zugegriffen.The static member is always accessed by the class name, not the instance name. Es ist nur eine Kopie eines statischen Members vorhanden, unabhängig davon, wie viele Instanzen der Klasse erstellt werden.Only one copy of a static member exists, regardless of how many instances of the class are created. Statische Methoden und Eigenschaften können nicht auf nicht statische Felder und Ereignisse in ihrem enthaltenden Typ zugreifen, und sie können nicht auf eine Instanzvariable für ein beliebiges Objekt zugreifen, außer es wird ausdrücklich an einen Methodenparameter übergeben.Static methods and properties cannot access non-static fields and events in their containing type, and they cannot access an instance variable of any object unless it is explicitly passed in a method parameter.

Es ist üblicher, eine nicht statische Klasse mit einigen statischen Membern zu deklarieren, statt eine ganze Klasse als statisch zu deklarieren.It is more typical to declare a non-static class with some static members, than to declare an entire class as static. Zwei häufige Verwendungen von statischen Feldern bestehen daraus, dass die Anzahl von instanziierten Objekten mitgezählt wird, oder dass ein Wert gespeichert wird, der für alle Instanzen freigegeben werden muss.Two common uses of static fields are to keep a count of the number of objects that have been instantiated, or to store a value that must be shared among all instances.

Statische Methoden können überladen, aber nicht überschrieben werden, da sie zu der Klasse gehören und nicht zu einer Instanz der Klasse.Static methods can be overloaded but not overridden, because they belong to the class, and not to any instance of the class.

Obwohl ein Feld nicht als static const deklariert werden kann, ist ein const-Feld in seinem Verhalten grundsätzlich statisch.Although a field cannot be declared as static const, a const field is essentially static in its behavior. Es gehört zum Typ und nicht zu Instanzen des Typs.It belongs to the type, not to instances of the type. Daher kann auf const-Felder mithilfe der gleichen Notation ClassName.MemberName zugegriffen werden, die für statische Felder verwendet wird.Therefore, const fields can be accessed by using the same ClassName.MemberName notation that is used for static fields. Es wird keine Objektinstanz benötigt.No object instance is required.

C# unterstützt keine statischen lokalen Variablen (Variablen, die im Methodenbereich deklariert werden).C# does not support static local variables (variables that are declared in method scope).

Deklarieren Sie statische Klassenmember mithilfe des Schlüsselworts static vor dem Rückgabetyp des Members, wie im folgenden Beispiel gezeigt wird:You declare static class members by using the static keyword before the return type of the member, as shown in the following example:

public class Automobile
{
    public static int NumberOfWheels = 4;
    public static int SizeOfGasTank
    {
        get
        {
            return 15;
        }
    }
    public static void Drive() { }
    public static event EventType RunOutOfGas;

    // Other non-static fields and properties...
}

Statische Member werden initialisiert, bevor auf die statischen Member zum ersten Mal zugegriffen wird, und bevor der statische Konstruktor, sofern vorhanden, aufgerufen wird.Static members are initialized before the static member is accessed for the first time and before the static constructor, if there is one, is called. Verwenden Sie zum Angeben des Speicherorts des Members den Namen der Klasse anstelle des Variablennamens, um auf einen statischen Klassenmember zuzugreifen, wie im folgenden Beispiel gezeigt wird:To access a static class member, use the name of the class instead of a variable name to specify the location of the member, as shown in the following example:

Automobile.Drive();
int i = Automobile.NumberOfWheels;

Wenn Ihre Klasse statische Felder enthält, stellen Sie einen statischen Konstruktor bereit, der sie beim Laden der Klasse initialisiert.If your class contains static fields, provide a static constructor that initializes them when the class is loaded.

Ein Aufruf einer statischen Methode erzeugt eine Aufrufanweisung in Microsoft Intermediate Language (MSIL), während ein Aufruf einer Instanzmethode eine Anweisung callvirt erzeugt, die auch auf Verweise auf ein NULL-Objekt überprüft.A call to a static method generates a call instruction in Microsoft intermediate language (MSIL), whereas a call to an instance method generates a callvirt instruction, which also checks for a null object references. Jedoch ist in den meisten Fällen der Leistungsunterschied zwischen den beiden nicht bedeutend genug.However, most of the time the performance difference between the two is not significant.

C#-ProgrammiersprachenspezifikationC# Language Specification

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

Siehe auchSee Also

C#-ProgrammierhandbuchC# Programming Guide
staticstatic
KlassenClasses
classclass
Statische KonstruktorenStatic Constructors
InstanzkonstruktorenInstance Constructors