Statiska klasser och statiska klassmedlemmar i C # förklarade

Det statiska nyckelordet i programmeringsspråket C # låter dig definiera statiska klasser och statiska medlemmar.

En statisk klass liknar en klass som är både abstrakt och förseglad. Skillnaden mellan en statisk klass och en icke-statisk klass är att en statisk klass inte kan initieras eller ärvas och att alla medlemmar i klassen är statiska. För att förklara en klass som statisk bör du markera den med det statiska nyckelordet i klassdeklarationen. 

Det finns inget beteende i en statisk klass eller medlem, så det finns ingen anledning att låta en statisk klass ärvas heller. En statisk klass kan bara ha statiska medlemmar - du kan inte deklarera förekomstmedlemmar (metoder, variabler, egenskaper etc.) i en statisk klass. Du kan ha en statisk konstruktör i en statisk klass men du kan inte ha en instanskonstruktör i en statisk klass.

När ska man använda en statisk klass i C #

När ska du gå för en statisk klass? Vanligtvis kan du implementera hjälp- eller verktygsklasser som statiska klasser eftersom de inte behöver initieras eller ärvas och generellt innehåller en samling av några återanvändbara metoder och egenskaper. Följande kodlista illustrerar hur en statisk klass i C # ser ut.

offentlig statisk klass FileLogger

    {

        offentlig statisk ogiltig logg (strängmeddelande)

        {

            // Metod för att logga data i en textfil

        }

    }

När ska man använda statiska metoder i C #

Statiska metoder är metoder som inte kräver att en instans av klassen åberopas - de kan kallas på själva klassen. Observera att statiska metoder endast kan komma åt statiska klassmedlemmar. Du kan ha statiska metoder i en statisk klass eller en icke-statisk klass. Du kan också ha en statisk konstruktör i en statisk klass eller en icke-statisk klass. En statisk konstruktör används för att initialisera de statiska medlemmarna i en klass. Den statiska konstruktören för en klass åberopas första gången en statisk medlem av klassen öppnas.

Varför ska vi använda statiska metoder? De körs lite snabbare än icke-statiska metoder, dvs förekomstmetoder. Anledningen är att körtiden skickar thispekaren som en implicit parameter till de icke-statiska eller instansmetoderna. Observera att kompilatorn avger callvirtinstruktionen för en icke-statisk metod även om metoden är icke-virtuell. Om du gör dina metoder statiska, avger kompilatorn icke-virtuella callwebbplatser, vilket eliminerar den extra kontrollen för om förekomsten är null. Detta kan ge dig några prestationsfördelar.

Därför kan det vara värt att använda statiska typer och metoder i din kod om applikationen du bygger är prestandakritisk. Prestationsvinsterna kan vara märkbara om din kod ringer ett stort antal samtal till sådana typer och medlemmar.

Följande kodavsnitt illustrerar hur en statisk metod ser ut.

offentlig statisk ogiltig logg (strängmeddelande)

        {

             sträng filePath = @ "F: \ Log.txt";

            använder (StreamWriter streamWriter = ny StreamWriter (filePath, true))

            {

                streamWriter.WriteLine (meddelande);

                streamWriter.Close ();

            }

        }

Hur man använder statiska medlemmar i en klass i C #

CLR delar systemminnet i tre distinkta regioner: stacken, högen och högfrekvent högen. Eftersom statiska objekt kan nås direkt utan att skapa instanser av klassen måste de finnas i minnet under hela applikationens livstid. de behöver inte samlas in. Därför lagras statiska objekt i högfrekvent hög. Du har vanligtvis en högfrekvent hög för varje applikationsdomän.

Låt oss nu titta på statiska medlemmar i en klass. Återigen är ett statiskt objekt som finns kvar i minnet hela tiden applikationen körs. Genom att utvidga loggningsexemplet ovan illustrerar följande kodlista hur en FileLogger-klass med statiska medlemmar skulle se ut.

offentlig statisk klass FileLogger

    {

        privat statisk readonly objekt lockObject = nytt objekt ();

        offentlig statisk sträng FilePath

        {

            skaffa sig; uppsättning;

        }

        offentlig statisk ogiltig logg (strängmeddelande)

        {

            lås (lockObject)

            {

                if (! string.IsNullOrEmpty (FilePath))

                använder (StreamWriter streamWriter = new StreamWriter (FilePath, true))

                {

                    streamWriter.WriteLine (meddelande);

                    streamWriter.Close ();

                }

            }

        }

    }

Notera användningen av den statiska egenskapen som heter FilePath. För att säkerställa trådsäkerhet har locknyckelordet använts. En kontroll har gjorts inuti Log()metoden för att verifiera att FilePathfastighetens värde inte är null och inte tomt.

Kom ihåg att när applikationshastighet är avgörande kan det löna sig att använda statiska metoder. Du kan använda dem i både statiska klasser och icke-statiska klasser.