Megosztás a következőn keresztül:


Statikus osztályok és statikus osztálytagok (C# programozási útmutató)

A statikus osztály alapvetően megegyezik a nem statikus osztályéval, de van egy különbség: a statikus osztály nem hozható létre. Más szóval nem használhatja az új operátort az osztálytípus változójának létrehozásához. Mivel nincs példányváltozó, a statikus osztály tagjait magát az osztálynevet használva érheti el. Ha például UtilityClass nevű statikus osztálya MethodAnevű nyilvános statikus metódussal rendelkezik, a metódust az alábbi példában látható módon hívhatja meg:

UtilityClass.MethodA();

A statikus osztály kényelmes tárolóként használható olyan metóduskészletekhez, amelyek csak bemeneti paramétereken működnek, és nem kell belső példánymezőket lekérni vagy beállítani. A .NET-osztálytárban például a statikus System.Math osztály olyan metódusokat tartalmaz, amelyek matematikai műveleteket hajtanak végre anélkül, hogy a Math osztály egy adott példányára egyedi adatokat kell tárolni vagy lekérni. Vagyis az osztály tagjait az osztálynév és a metódus nevének megadásával alkalmazza, ahogyan az az alábbi példában is látható.

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

Ahogy az összes osztálytípus esetében, a .NET-futtatókörnyezet betölti egy statikus osztály típusadatait, amikor az osztályra hivatkozó program betöltődik. A program nem tudja pontosan megadni, hogy mikor töltődik be az osztály. Azonban garantáltan betöltődik, és inicializálja a mezőket, és meghívja a statikus konstruktort, mielőtt a program első alkalommal hivatkozik az osztályra. A statikus konstruktorokat csak egyszer nevezik, és a statikus osztály a memóriában marad annak az alkalmazástartománynak az élettartama alatt, amelyben a program található.

Megjegyzés

Ha olyan nem statikus osztályt szeretne létrehozni, amely csak egy példány létrehozását teszi lehetővé, olvassa el A Singleton implementálása c#.

Az alábbi lista a statikus osztály fő funkcióit tartalmazza:

  • Csak statikus tagokat tartalmaz.

  • Nem lehet példányt létrehozni.

  • Le van zárva.

  • Nem tudja tartalmazni példánykonstruktorokat.

A statikus osztály létrehozása tehát alapvetően ugyanaz, mint egy olyan osztály létrehozása, amely csak statikus tagokat és privát konstruktorokat tartalmaz. A privát konstruktor megakadályozza az osztály példányosítását. A statikus osztály használatának előnye, hogy a fordító ellenőrizheti, hogy véletlenül nem lettek-e példánytagok hozzáadva. A fordító garantálja, hogy az osztály példányai nem hozhatók létre.

A statikus osztályok lezárva vannak, ezért nem örökölhetők. A Objectkivételével egyetlen osztályból vagy felületről sem örökölhetnek. A statikus osztályok nem tartalmazhatnak példánykonstruktort. Azonban statikus konstruktort is tartalmazhatnak. A nem statikus osztályok statikus konstruktort is definiálnak, ha az osztály olyan statikus tagokat tartalmaz, amelyek nem triviális inicializálást igényelnek. További információ: Statikus konstruktorok.

Példa

Íme egy példa egy statikus osztályra, amely két metódust tartalmaz, amelyek a hőmérsékletet Celsiusról Fahrenheitre, a Fahrenheitből pedig Celsius-fokra konvertálják:

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() ?? "0");
                Console.WriteLine($"Temperature in Fahrenheit: {F:F2}");
                break;

            case "2":
                Console.Write("Please enter the Fahrenheit temperature: ");
                C = TemperatureConverter.FahrenheitToCelsius(Console.ReadLine() ?? "0");
                Console.WriteLine($"Temperature in Celsius: {C:F2}");
                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.
 */

Statikus tagok

A nem statikus osztály tartalmazhat statikus metódusokat, mezőket, tulajdonságokat vagy eseményeket. A statikus tag akkor is meghívható egy osztályon, ha az osztálynak nincs példánya. A statikus tagra mindig az osztály neve alapján hivatkozhatunk, nem a példány neve alapján. A statikus tagnak csak egy példánya létezik, függetlenül attól, hogy az osztály hány példánya jön létre. A statikus metódusok és tulajdonságok nem férnek hozzá a nem statikus mezőkhöz és eseményekhez a bennük található típusban, és nem férhetnek hozzá egyetlen objektum példányváltozóihoz sem, kivéve, ha a metódusparaméter explicit módon adja át.

Jellemzőbb, ha nem statikus osztályt deklarál néhány statikus taggal, mint egy teljes osztályt statikusként deklarálni. A statikus mezők két gyakori használata a példányosított objektumok számának megtartása, vagy egy olyan érték tárolása, amelyet meg kell osztani az összes példány között.

A statikus metódusok túlterhelhetők, de nem felülbíráltak, mert az osztályhoz tartoznak, és nem az osztály egyik példányához sem.

Bár egy mező nem deklarálható static const, a const mező működése lényegében statikus. A típushoz tartozik, nem a típus példányaihoz. Ezért const mezők a statikus mezőkhöz használt ClassName.MemberName jelöléssel érhetők el. Nincs szükség objektumpéldányra.

A C# nem támogatja a statikus helyi változókat (vagyis a metódus hatókörében deklarált változókat).

Statikus osztálytagokat úgy deklarálhat, hogy az static kulcsszót használja a tag visszatérési típusa előtt, ahogyan az az alábbi példában látható:

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...
}

A statikus tagok inicializálása a statikus tag első elérése előtt, és amennyiben van, a statikus konstruktor meghívása előtt történik meg. Statikus osztálytag eléréséhez használja az osztály nevét változónév helyett a tag helyének megadásához, ahogyan az az alábbi példában látható:

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

Ha az osztály statikus mezőket tartalmaz, adjon meg egy statikus konstruktort, amely inicializálja őket az osztály betöltésekor.

A statikus metódus hívása egy általános köztes nyelven (CIL) generál hívási utasítást, míg egy példánymetódus hívása egy callvirt utasítást hoz létre, amely null objektumhivatkozásokat is keres. A legtöbb esetben azonban a kettő közötti teljesítménykülönbség nem jelentős.

C# nyelvi specifikáció

További információ: Statikus osztályok, Statikus és példánytagok és Statikus konstruktorok a C# nyelv specifikációja. A nyelvi specifikáció a C#-szintaxis és -használat végleges forrása.

Lásd még