Singleton pattern i C#

Relaterede dokumenter
Singleton pattern i Java

RMI introduktion. Denne artikel beskriver Java RMI (Remtote Method Invocation).

Den forudsætter kendskab til XML og C# men ikke til brug af XML i C#.

Introduction til.net remoting i C#

Introduction til.net remoting i VB.NET

Threads i Java. Denne artikel giver en introduktion til threads i Java. Den beskriver hvad tråde er og forklarer hvordan de bruges i Java

//Udskriver System.out.println("Hej " + ditfornavn + " " + ditefternavn + "."); System.out.println("Du er " + dinalder + " aar gammel!

Tilfældige tal. Denne artikel introducerer generering af tilfældige tal og viser lidt om hvad man kan og ikke mindst hvad man ikke bør bruge.

Send fra Java. Denne artikel fortæller hvad man skal bruge og hvordan man skal kode for at sende fra Java.

Den forudsætter kendskab til XML og VB.NET men ikke til brug af XML i VB.NET.

Anvendelse af metoder - Programmering

Parameters. Denne artikel beskriver hvorfor parameters er gode. Den forudsætter lidt kendskab til C# og ADO.NET.

Hvad er Objekter - Programmering

Bits, bit operationer, integers og floating point

RMI avanceret. Denne artikel beskriver nogle mere avancerede features i RMI. Den gør det muligt at lave mere realistiske applikationer.

Test med JUnit 3. Denne artikel introducerer JUnit 3. Den forklarer ideen med JUnit. Og den viser hvordan man konkret bruger det.

I denne artikel vil vi bruge en User klasse som vi så vil gruppere på forskellige måder.

Java Klasse nedarvninger

A Profile for Safety Critical Java

Prepared Statements. Denne artikel beskriver hvorfor prepared statements er gode. Den forudsætter lidt kendskab til Java og JDBC.

Test med NUnit. Denne artikel introducerer NUnit. Den forklarer ideen med NUnit. Og den viser hvordan man konkret bruger det.

Undtagelseshåndtering i C#

Database design for begyndere

SWC Elementer i klassedefinition

Den forudsætter kendskab til C++ og lidt kendskab til SQL og MySQL C API.

Introduktion til AOP i C#

Arkitektur for begyndere

Arrays i PHP. Denne guide er oprindeligt udgivet på Eksperten.dk. Skrevet den 04. Feb 2009 af taskmgr I kategorien Programmering / PHP

AAU, Programmering i Java Intern skriftlig prøve 18. maj 2007

Som sagt kræves der helst lidt viden om OOP hvis man virkelig vil lærer noget, og ikke bare lave copypaste

Skrevet den 18. Feb 2010 af arne_v I kategorien Programmering / Visual Basic.NET

At klippe en streng over på det mest hensigtsmæssige sted

Modern Concurrency Abstractions for C#

Dvs. at give dit program muligheden for at loade og bruge plugins som andre har lavet.

SWC eksamens-spørgsmål. Oversigt

Hvilket sprog er hurtigst

Offset til terminalskærm i Java

Logging i Java. Den forudsætter kendskab til Java og noget generel udviklings erfaring. Denne guide er oprindeligt udgivet på Eksperten.

DM01 DM Obl. Afl. Jacob Christiansen, , D12, Elias 18/ Side 1 af 11

Forskellige Java versioner

I denne artikel vil du ved hjælp af arrays kunne afrunde et decimaltal til et helt tal.

Objektorienteret design med arv og polymorfi:

Sådan skriver du artikler til Eksperten!

class subklasse-navn extends superklasse-navn { } NorwaySpruce har superklassen Spruce, som igen har superklassen Tree.

.NET 4.0 og C# 4.0. Denne artikel beskriver nogle af de nye features i.net 4.0 og C# 4.0. Den forudsætter et vist kendskab til.net og C#.

Database tips. Den forudsætter lidt kendskab til SQL men er for mindre erfarne. Denne guide er oprindeligt udgivet på Eksperten.dk

Abstrakte datatyper C#-version

Delphi - CrackMe og Keygen

Med register_globals = On får du automatisk adgang til en række variabelnavne i dit script.

Grundlæggende Programmering ITU, Efterår Skriftlig eksamen i Grundlæggende Programmering

Plugin-arkitektur med.net

METODER ARV KLASSER. Grundlæggende programmering Lektion 5

Introduktion til funktioner, moduler og scopes i Python

XML parsning i Java. Denne artikel beskriver hvordan man parser XML i Java. Den beskriver W3C DOM, SAX og JDOM.

Software Construction 1 semester (SWC) Spørgsmål 1

Nye Java XML API'er

Lektion 6. Grundlæggende programmering i VR

Ratingsystem i PHP og MySQL

Introduktion til SQL queries

Kontrol-strukturer i PHP

University of Southern Denmark Syddansk Universitet. DM503 Forelæsning 11

CodeDOM - Dynamisk generering og kompilering af kode

Gæstebog med validering opbygget med MySQL

Delphi og Databaser for begyndere

DM507 Algoritmer og datastrukturer

Endnu mere om tilfældige tal

Upload af billeder/filer for nybegyndere Del. 2

DANMARKS TEKNISKE UNIVERSITET

DM507 Algoritmer og datastrukturer

Common Language Runtime. Multithreading

Afsending af s vha. ASP

Geografisk lokalisering i ASP.NET

C# spil (del 1) - Kom i gang med et simpelt spil

14.1 Internationale programmer

Real-time programming safety in Java and Ada

b) Udvid din implementation af forme til at understøtte.equals. To objekter af samme form er ens hvis de har samme værdier i felterne.

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 2

Introduktion til ant. Denne artikel beskriver Apache ant, som er et værktøj til at builde Java applikationer med.

Arrays og deres slægtskab med objects

Hvilket sprog skal jeg lære?

IT projekt person galleri

Simpel upload af filer

BRP Kursusintroduktion og Java-oversigt

Videregående Programmering Obligatorisk opgave - 3. semester, efterår 2004

.NET 4.5 og C# 5.0. Denne artikel beskriver nogle af de nye features i.net 4.5 og C# 5.0. Den forudsætter et vist kendskab til.net og C#.

Klasser og objekter. (Afsnit i manualen)

Tagwall med Php & MySQL

Datalogi OB, Efterår 2002 OH er, forelæsning 10/ Klasser og nedarvning

Løsning af møntproblemet

Denne artikel er til dem der ønsker at vide mere om hvad CSS er og hvad CSS kan bruges til hvad angår WWW.

class Time { int hours, min; } } Time t1; // Erklær variabel af type Time class Time1 { public static void main(string[] args) { Time t1; t1.

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 4

DM507 Algoritmer og datastrukturer

DM502. Peter Schneider-Kamp

Polymorfi. Arv (inheritance) Abstrakte klasser, substitutionsprincippet, overriding, statisk og dynamisk type. Coercion

Test af It-komponent

Listen over reserverede ord er meget lang, men de væsentligste vil jeg beskrive her i denne artikel:

Kursus i OOP og Java. Kursus i Objektorienteret programmering i Java

PHP Pagination. Denne guide er oprindeligt udgivet på Eksperten.dk. Skrevet den 01. May 2011 af dab93 I kategorien Programmering / Andre

Database programmerings tips

Transkript:

Denne guide er oprindeligt udgivet på Eksperten.dk Singleton pattern i C# Denne artikel beskriver Singleton pattern og implementation i C#. Den forudsætter kendskab til C# men ikke til Singleton. Der er en anden artikel med præcis samme indhold bare i VB.NET! Skrevet den 09. Feb 2009 af arne_v I kategorien Programmering / C# Historie: V1.0-12/01/2004 - original V1.1-31/01/2004 - forbedret formatering V1.2-17/02/2004 - tilføj henvisning til MSDN artikel om lock typeof V1.3-07/03/2004 - tilføj henvisning til VB.NET artikel V1.4-10/05/2005 - ændre til at double locking heller ikke er sikker i.net Teori Singleton pattern løser problemet med at man kun vil have en enkelt instans af en given klasse. Singleton pattern er en god objekt orienteret løsning på samme problem som løses ikke objekt orienteret via en klasse med kun static members og methods. Singleton pattern er et såkaldt GoF pattern, hvilket refererer til bogen "Design Patterns" af Erich Gamma, Richard Helm, Ralph Johnson og John Vlissides (4 forfattere = Gang Of Four = GoF). Kendetegnene ved en singleton klasse er: - public static metode GetInstance eller property Instance - private constructor (den original GoF kode bruger protected constructor og det kan man også godt, men min erfaring er at man ikke kan arve fra en singleton klasse på fornuftig vis) Eksempel Her er et standard eksempel på en singleton klasse: public class S1 private static S1 instance = null; private S1()

// public static metode til at hente instance public static S1 GetInstance() instance = new S1(); eller: public class S2 private static S2 instance = new S2(); private S2() // public static metode til at hente instance public static S2 GetInstance()

C# tillader imidlertid et elegant alternativ med brug af property: public class S3 private static S3 instance = null; private S3() // property til at hente instance public static S3 Instance get instance = new S3(); Klassen kan bruges som følger: class MainClass public static void Main(string[] args) S3 a = S3.Instance; a.add("a"); S3 b = S3.Instance;

b.add("b"); S3 c = S3.Instance; ArrayList list = c.getlist(); for(int i = 0; i < list.count; i++) Console.WriteLine((string)list[i]); Singleton i multithreaded kontekst Bemærk at i en multithreaded kontekst bør man kode sin singleton klasse som: public class S4 private static S4 instance = null; private S4() // lock object private static object mylock = new object(); // property til at hente instance public static S4 Instance get lock(mylock) instance = new S4();

Vær forsigtig med at bruge: public class S5 private static S5 instance = null; private S5() // lock object private static object mylock = new object(); // property til at hente instance public static S5 Instance get lock(mylock) instance = new S5(); For selvom det er blevet hævdet af mange inkl. diverse

Microsoft eksempler, at dette trick kendt som double locing altid virker i.net, så er fakta at det kun altid virker på IA-32 og AMD-64 kompatible CPU'er. Problemet kan løses ved enten at erklære instance field som volatile eller bruge Thread.MemoryBarrier, men så er en banal lock nok pænere. Der er dog ikke mange som kører.net på IA-64 CPU'er endnu. I.NET verdenen er det ildeset med brug af lock(typeof(sx)) og det bør derfor undgåes (selvom argumentet måske er lidt tyndt)! For detaljer om dette læs: http://blogs.msdn.com/brada/archive/2004/05/12/130935.aspx http://blogs.gotdotnet.com/cbrumme/permalink.aspx/480d3a6d-1aa8-4694-96db-c69f01d7ff2b http://discuss.develop.com/archives/wa.exe?a2=ind0203b&l=dotnet&p=r375 og: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnaskdr/html/askgui06032003.asp Kommentar af iakob d. 17. Jun 2004 1 Der er et godt, brugbart og simpelt eksempel på en implementation. Jeg synes artiklen godt kunne have undværet de "uelegante" løsninger (forfatteren har selv en favorit og jeg er enig i hans valg. Der er en enkelt påstand omkring noget man bør undgå, som der ikke er argumenteret for Kommentar af repsak d. 16. Feb 2004 2 Mange eksempler :-) Ser dog ikke grund til at lave så mange næsten ens, selvom der er en god pointe/linje imellem de forskellige versioner og forbedringer. Efter min mening mangler dog et argument for den sidste linje :-) Kommentar af thundergod d. 07. May 2004 3 Artiklen lever op til overskriften. Det er kun anvendelsen af Property, og lock(...) der er ny information. Kommentar af jimgordon d. 04. Dec 2004 4 Perfekt miniartikel. Giver singleton fidusen i fin telegramstil, så man er klar til den tungere litterature omkring dette uundværlige programmeringsdesign. Kommentar af innercitydk d. 27. Jul 2006 5 Super artikel. Så er der styr på singleton til bunds ;) Kommentar af impero d. 29. Jun 2011 6 Ved godt dette er en gammel guide, men ville lige give mit input til nye læsere. Den måde jeg foretrækker at lave singletons i C# er følgende: class Singleton private Singleton()

public static Singleton Instance get return Nested.Singleton; private class Nested static Nested() internal static readonly Singleton Singleton = new Singleton(); Denne metode er både thread-safe og lazy, hvilket betyder at den virker i multi-threaded programmer samt at den først opretter singleton objektet når det bliver refereret første gang. Derudover er den super simpel at implementere og kræver ikke brug af locks. Kommentar af arne_v d. 31. Oct 2011 7 re impero) Den teknik er ret kendt. Men har du nogen sinde set et eksempel hvor overhead ved den lock er stort nok til at begrunde de ekstra linier kode??