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 az osztály egy adott példányára egyedi adatokat kell tárolniuk vagy lekérni.Math 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) =>
        double.Parse(temperatureCelsius) * 9 / 5 + 32;

    public static double FahrenheitToCelsius(string temperatureFahrenheit) =>
        (double.Parse(temperatureFahrenheit) - 32) * 5 / 9;
}

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();

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

            case "2":
                Console.Write("Please enter the Fahrenheit temperature: ");
                var 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. Általános típusok esetén minden zárt generikus típusnak saját példánya van a statikus tagokról. A ThreadStaticAttribute jelzett statikus mezők szálanként egy példánnyal rendelkeznek. 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 => 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();
var 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