.net - What is a singleton in C#?

ID : 20015

viewed : 66

Tags : c#.netsingletonc#

Top 5 Answer for .net - What is a singleton in C#?

vote vote

100

A singleton is a class which only allows one instance of itself to be created - and gives simple, easy access to said instance. The singleton premise is a pattern across software development.

There is a C# implementation "Implementing the Singleton Pattern in C#" covering most of what you need to know - including some good advice regarding thread safety.

To be honest, It's very rare that you need to implement a singleton - in my opinion it should be one of those things you should be aware of, even if it's not used too often.

vote vote

80

You asked for C#. Trivial example:

 public class Singleton {     private Singleton()     {         // Prevent outside instantiation     }      private static readonly Singleton _singleton = new Singleton();      public static Singleton GetSingleton()     {         return _singleton;     } } 
vote vote

79

What it is: A class for which there is just one, persistent instance across the lifetime of an application. See Singleton Pattern.

When you should use it: As little as possible. Only when you are absolutely certain that you need it. I'm reluctant to say "never", but there is usually a better alternative, such as Dependency Injection or simply a static class.

vote vote

69

another way to implement singleton in c#, i personally prefer this way because you can access the instance of the singeton class as a property instead of a method.

public class Singleton     {         private static Singleton instance;          private Singleton() { }          public static Singleton Instance         {             get             {                 if (instance == null)                     instance = new Singleton();                 return instance;             }         }          //instance methods     } 

but well, as far as i know both ways are considered 'right' so it's just a thing of personal flavor.

vote vote

50

using System; using System.Collections.Generic; class MainApp {     static void Main()     {         LoadBalancer oldbalancer = null;         for (int i = 0; i < 15; i++)         {             LoadBalancer balancerNew = LoadBalancer.GetLoadBalancer();              if (oldbalancer == balancerNew && oldbalancer != null)             {                 Console.WriteLine("{0} SameInstance {1}", oldbalancer.Server, balancerNew.Server);             }             oldbalancer = balancerNew;         }         Console.ReadKey();     } }  class LoadBalancer {     private static LoadBalancer _instance;     private List<string> _servers = new List<string>();     private Random _random = new Random();      private static object syncLock = new object();      private LoadBalancer()     {         _servers.Add("ServerI");         _servers.Add("ServerII");         _servers.Add("ServerIII");         _servers.Add("ServerIV");         _servers.Add("ServerV");     }      public static LoadBalancer GetLoadBalancer()     {         if (_instance == null)         {             lock (syncLock)             {                 if (_instance == null)                 {                     _instance = new LoadBalancer();                 }             }         }          return _instance;     }      public string Server     {         get         {             int r = _random.Next(_servers.Count);             return _servers[r].ToString();         }     } } 

I took code from dofactory.com, nothing so fancy but I find this far good than examples with Foo and Bar additionally book from Judith Bishop on C# 3.0 Design Patterns has example about active application in mac dock.

If you look at code we are actually building new objects on for loop, so that creates new object but reuses instance as a result of which the oldbalancer and newbalancer has same instance, How? its due to static keyword used on function GetLoadBalancer(), despite of having different server value which is random list, static on GetLoadBalancer() belongs to the type itself rather than to a specific object.

Additionally there is double check locking here

if (_instance == null)             {                 lock (syncLock)                 {                     if (_instance == null) 

since from MSDN

The lock keyword ensures that one thread does not enter a critical section of code while another thread is in the critical section. If another thread tries to enter a locked code, it will wait, block, until the object is released.

so every-time mutual-exclusion lock is issued, even if it don't need to which is unnecessary so we have null check.

Hopefully it helps in clearing more.

And please comment if I my understanding is directing wrong ways.

Top 3 video Explaining .net - What is a singleton in C#?

Related QUESTION?