Klasy statyczne i statyczni członkowie klas (Przewodnik programowania w języku C#)Static Classes and Static Class Members (C# Programming Guide)

Klasa statyczna jest zasadniczo taka sama jak Klasa niestatyczna, ale istnieje jedna różnica: nie można utworzyć wystąpienia klasy statycznej.A static class is basically the same as a non-static class, but there is one difference: a static class cannot be instantiated. Innymi słowy, nie można użyć operatora New , aby utworzyć zmienną typu klasy.In other words, you cannot use the new operator to create a variable of the class type. Ponieważ nie istnieje zmienna wystąpienia, dostęp do elementów członkowskich klasy statycznej można uzyskać przy użyciu samej nazwy klasy.Because there is no instance variable, you access the members of a static class by using the class name itself. Na przykład jeśli masz klasę statyczną o nazwie UtilityClass , która ma publiczną metodę statyczną o nazwie MethodA, wywoływana jest metoda, jak pokazano w następującym przykładzie:For example, if you have a static class that is named UtilityClass that has a public static method named MethodA, you call the method as shown in the following example:

UtilityClass.MethodA();  

Klasa statyczna może być używana jako wygodny kontener dla zestawów metod, które po prostu działają w parametrach wejściowych i nie muszą pobierać ani ustawiać żadnych pól wystąpienia wewnętrznego.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. Na przykład w bibliotece klas .NET Framework Klasa statyczna System.Math zawiera metody, które wykonują operacje matematyczne, bez konieczności przechowywania lub pobierania danych, które są unikatowe dla określonego wystąpienia Math klasy.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. Oznacza to, że należy zastosować elementy członkowskie klasy, określając nazwę klasy i nazwę metody, jak pokazano w poniższym przykładzie.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  

Podobnie jak w przypadku wszystkich typów klas, informacje o typie klasy statycznej są ładowane przez .NET Framework środowiska uruchomieniowego języka wspólnego (CLR) podczas ładowania programu, który odwołuje się do klasy.As is the case with all class types, the type information for a static class is loaded by the .NET Framework common language runtime (CLR) when the program that references the class is loaded. Program nie może określić dokładnie, gdy Klasa jest załadowana.The program cannot specify exactly when the class is loaded. Jednak zagwarantowane jest załadowanie i zainicjowanie jego pól oraz jego konstruktora statycznego wywołanego przed odwołaniem do klasy po raz pierwszy w programie.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. Konstruktor statyczny jest wywoływany tylko jednokrotnie, a Klasa statyczna pozostaje w pamięci przez okres istnienia domeny aplikacji, w której znajduje się program.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.

Uwaga

Aby utworzyć niestatyczną klasę, która umożliwia utworzenie tylko jednego wystąpienia, zobacz Implementowanie pojedynczych elementów w C# .To create a non-static class that allows only one instance of itself to be created, see Implementing Singleton in C#.

Poniższa lista zawiera główne funkcje klasy statycznej:The following list provides the main features of a static class:

  • Zawiera tylko statyczne elementy członkowskie.Contains only static members.

  • Nie można utworzyć wystąpienia.Cannot be instantiated.

  • Jest zapieczętowany.Is sealed.

  • Nie może zawierać konstruktorów wystąpień.Cannot contain Instance Constructors.

Tworzenie klasy statycznej jest tak samo samo jak w przypadku tworzenia klasy, która zawiera tylko statyczne elementy członkowskie i Konstruktor prywatny.Creating a static class is therefore basically the same as creating a class that contains only static members and a private constructor. Konstruktor prywatny uniemożliwia utworzenie wystąpienia klasy.A private constructor prevents the class from being instantiated. Zaletą używania klasy statycznej jest to, że kompilator może sprawdzić, czy żaden element członkowski wystąpienia nie został przypadkowo dodany.The advantage of using a static class is that the compiler can check to make sure that no instance members are accidentally added. Kompilator gwarantuje, że wystąpienia tej klasy nie mogą zostać utworzone.The compiler will guarantee that instances of this class cannot be created.

Klasy statyczne są zapieczętowane i w związku z tym nie można ich dziedziczyć.Static classes are sealed and therefore cannot be inherited. Nie mogą dziedziczyć z żadnej klasy Objectz wyjątkiem.They cannot inherit from any class except Object. Klasy statyczne nie mogą zawierać konstruktora wystąpień; jednak mogą zawierać statyczny Konstruktor.Static classes cannot contain an instance constructor; however, they can contain a static constructor. Klasy niestatyczne powinny także definiować Konstruktor statyczny, jeśli Klasa zawiera statyczne składowe, które wymagają inicjalizacji nieuproszczonej.Non-static classes should also define a static constructor if the class contains static members that require non-trivial initialization. Aby uzyskać więcej informacji, zobacz statyczne konstruktory.For more information, see Static Constructors.

PrzykładExample

Oto przykład klasy statycznej zawierającej dwie metody, które konwertują temperaturę z Celsjusza na Fahrenheita i od Fahrenheita do c: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.
 */

Statyczne elementy członkowskieStatic Members

Klasa niestatyczna może zawierać statyczne metody, pola, właściwości lub zdarzenia.A non-static class can contain static methods, fields, properties, or events. Statyczny element członkowski jest wywoływany na klasie nawet wtedy, gdy nie utworzono żadnego wystąpienia klasy.The static member is callable on a class even when no instance of the class has been created. Statyczny element członkowski jest zawsze używany przez nazwę klasy, a nie nazwę wystąpienia.The static member is always accessed by the class name, not the instance name. Istnieje tylko jedna kopia statycznej składowej, niezależnie od tego, ile wystąpień klasy zostały utworzone.Only one copy of a static member exists, regardless of how many instances of the class are created. Metody i właściwości statyczne nie mogą uzyskać dostępu do niestatycznych pól i zdarzeń w ich typie zawierającym i nie mogą uzyskać dostępu do zmiennej wystąpienia dowolnego obiektu, chyba że jest on jawnie przekazywać w parametrze metody.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.

Bardziej typowym jest zadeklarowanie niestatycznej klasy z pewnymi statycznymi składowymi, niż w celu deklarowania całej klasy jako statycznej.It is more typical to declare a non-static class with some static members, than to declare an entire class as static. Dwa typowe zastosowania pól statycznych mają na celu zachowanie liczby obiektów, które zostały utworzone, lub do przechowywania wartości, które muszą być współużytkowane przez wszystkie wystąpienia.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.

Metody statyczne mogą być przeciążone, ale nie przesłaniane, ponieważ należą do klasy, a nie do żadnego wystąpienia klasy.Static methods can be overloaded but not overridden, because they belong to the class, and not to any instance of the class.

Chociaż nie można zadeklarować pola jako static const, pole const jest zasadniczo statyczne w zachowaniu.Although a field cannot be declared as static const, a const field is essentially static in its behavior. Należy do typu, nie do wystąpienia typu.It belongs to the type, not to instances of the type. W związku z tym można uzyskać dostęp do pól const przy ClassName.MemberName użyciu tej samej notacji, która jest używana dla pól statycznych.Therefore, const fields can be accessed by using the same ClassName.MemberName notation that is used for static fields. Nie jest wymagane żadne wystąpienie obiektu.No object instance is required.

C#Program nie obsługuje statycznych zmiennych lokalnych (zmiennych, które są zadeklarowane w zakresie metody).C# does not support static local variables (variables that are declared in method scope).

Elementy członkowskie klasy statycznej deklaruje się static za pomocą słowa kluczowego przed typem zwracanym elementu członkowskiego, jak pokazano w następującym przykładzie: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...
}

Statyczne składowe są inicjowane przed uzyskaniem dostępu do statycznego elementu członkowskiego po raz pierwszy i przed konstruktorem statycznym, jeśli istnieje.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. Aby uzyskać dostęp do statycznej składowej klasy, użyj nazwy klasy zamiast nazwy zmiennej, aby określić lokalizację elementu członkowskiego, jak pokazano w następującym przykładzie: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;

Jeśli Klasa zawiera pola statyczne, podaj statyczny Konstruktor, który inicjuje je podczas ładowania klasy.If your class contains static fields, provide a static constructor that initializes them when the class is loaded.

Wywołanie metody statycznej generuje instrukcję wywołania w języku pośrednim firmy Microsoft (MSIL), podczas gdy wywołanie metody instancji generuje callvirt instrukcję, która również sprawdza odwołania do obiektów o wartości null.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. Jednak większość czasu różnica między wydajnością nie jest istotna.However, most of the time the performance difference between the two is not significant.

Specyfikacja języka C#C# Language Specification

Aby uzyskać więcej informacji, zobacz klasy statyczne i elementy członkowskie statyczne i wystąpienia w C# specyfikacji języka.For more information, see Static classes and Static and instance members in the C# Language Specification. Specyfikacja języka jest ostatecznym źródłem informacji o składni i użyciu języka C#.The language specification is the definitive source for C# syntax and usage.

Zobacz takżeSee also