En definitiv guide til singletons i C#

I C# er en singleton et designmønster som begrenser instansieringen av en klasse til et enkelt objekt. Den sikrer at bare én forekomst av klassen eksisterer i hele applikasjonen og gir global tilgang til den forekomsten.

Singletons og forholdsregler for bruk

Singletons er nyttige av flere grunner:

  • Global tilgang: Singletons gir en måte å ha en enkelt globalt tilgjengelig forekomst av en klasse. Dette kan være fordelaktig når det er behov for å dele data eller funksjonalitet på tvers av ulike deler av applikasjonen uten å sende referanser til objekter eksplisitt.
  • Ressursdeling: Singletoner kan brukes til å administrere ressurser som skal deles på tvers av flere objekter eller komponenter, for eksempel databasetilkoblinger, trådpooler eller hurtigbuffermekanismer. Ved å kapsle inn ressursstyringen i en enkelttonn kan man sikre at all tilgang til den delte ressursen går gjennom et sentralisert punkt, noe som muliggjør effektiv koordinering og unngår ressurskonflikter.
  • Kontrollert objektoppretting: Singletons tillater å kontrollere instansieringen av en klasse og sikre at bare én instans opprettes. Dette kan være viktig for å begrense antallet objekter som opprettes på grunn av ressursbegrensninger eller for å håndheve en spesifikk atferd knyttet til klassen.
  • On-demand initialisering: Singletons kan initialiseres på forespørsel, noe som betyr at forekomsten bare opprettes når den først åpnes. Dette kan være gunstig for ytelsen hvis det er dyrt å lage objektet eller for å utsette opprettelsen til det faktisk er nødvendig.
  • Synkronisering og gjengesikkerhet: Singleton-implementeringer kan inkludere synkroniseringsmekanismer, for eksempel låser eller dobbeltsjekket låsing, for å sikre gjengesikkerhet i miljøer med flere gjenger. Dette bidrar til å unngå raseforhold eller inkonsekvente tilstander når flere tråder samtidig får tilgang til singleton-forekomsten.

Det er verdt å merke seg at singletons, som ethvert designmønster, bør brukes med omtanke. Selv om de kan gi fordeler, introduserer de også en global tilstand og tett kobling, noe som kan gjøre testing og vedlikehold mer utfordrende. Det er viktig å vurdere den spesifikke brukssaken og vurdere om en singleton er den mest passende løsningen.

Sette opp Singleton

Her er et eksempel på implementering av en singleton i C#:

public sealed class Singleton
{
    private static Singleton instance;
    private static readonly object lockObject = new object();

    private Singleton() { } // Private constructor to prevent instantiation from outside

    public static Singleton Instance
    {
        get
        {
            if (instance == null) // Check if the instance is null
            {
                lock (lockObject) // Use lock to ensure thread safety
                {
                    if (instance == null) // Double-check locking to avoid race conditions
                    {
                        instance = new Singleton();
                    }
                }
            }
            return instance;
        }
    }

    // Other methods and properties
}

I dette eksemplet har klassen 'Singleton' en privat konstruktør som hindrer andre klasser i å lage nye forekomster av den. Klassen avslører en offentlig statisk egenskap kalt 'Instance', som er ansvarlig for å opprette og returnere enkeltforekomsten av klassen. Første gang 'Instance' åpnes, sjekker den om variabelen 'instance' er null, og i så fall bruker den en lås for å sikre trådsikkerhet mens den oppretter en ny forekomst.

Påfølgende anrop til 'Instance' vil returnere den eksisterende forekomsten uten å opprette en ny. Denne tilnærmingen garanterer at bare én forekomst av 'Singleton' eksisterer gjennom hele applikasjonen.

I dette tilfellet er 'Singleton' en forseglet klasse (merk nøkkelordet 'sealed' før klasseerklæringen) som er en klasse som ikke kan arves eller brukes som basisklasse for andre klasser. Når en klasse er merket som forseglet, forhindrer den andre klasser fra å komme fra den.

Singleton-forekomsten kan nås som følger:

Singleton singleton = Singleton.Instance;

Denne koden vil gi referansen til enkeltforekomsten av klassen 'Singleton', uavhengig av hvor den kalles i applikasjonen.

Konklusjon

Singletoner i C# er et designmønster som gjør det mulig å lage en enkelt forekomst av en klasse gjennom hele applikasjonen, og gir global tilgang til den forekomsten. De er nyttige for scenarier der det er nødvendig å dele data eller funksjonalitet på tvers av ulike deler av applikasjonen, administrere delte ressurser effektivt, kontrollere objektoppretting og sikre trådsikkerhet. Singletons kan også inkludere initialisering på forespørsel, der forekomsten bare opprettes når den først åpnes, og gir ytelsesfordeler ved å utsette opprettelsen til den faktisk er nødvendig. Imidlertid er det viktig å bruke singletoner med omtanke, med tanke på avveininger og potensielle ulemper forbundet med global stat og tett kobling. Nøye vurdering bør tas til den spesifikke brukssaken for å avgjøre om en singleton er den mest hensiktsmessige løsningen.

Foreslåtte artikler
C#-designmønstre
En guide til å skrive og hente data fra flertrådskode i C#
Ultimate Keyboard Guide for C#-utviklere
Hvordan læring C# kan bidra til å betale ned gjeld
Ultimate bærbar guide for C#-utviklere
Rollen til C# i Web3
Introduksjon til grensesnitt i C#