Delen via


Implementing a Singleton Class The Right way

I was in Teched Africa Last week and during my session one of the Audience "Carl Mönnig" shared a nice feedback about the way I was Implementing Singleton Class so Decided to Share it with everyone for future usage

 

I did not like the singleton pattern you used in the Win8 LOB In Depth talk… It looked something like this:

 

public class MySingleton ()

{

      private MySingleton () {} //Private cstr

     

      private static MySingleton _instance ;

     

      public static MySingleton Instance {

            get {

                  if ( _instance == null )

                        _instance = new MySingleton ()

                  return _instance ;

            }};

}

 

This is too much code and it is not thread-safe when multiple threads call MySingleton.Instance at the same time. You need to add double-check locking to make it thread-safe.

 

Cleaner option:

 

public class MySingleton ()

{

      private MySingleton () {} //Private cstr

      public static readonly MySingleton Instance = new MySingleton ();

}

 

The class will be constructed the first time MySingleton.Instance is called and will be get-only because of readonly. This is also thread-safe without any locks (handled by the CLR). This is a Poor Man's singleton, because serious applications will have an IoC container to provide singletons.

 

Thanks for the double session – I picked up a few useful tips. Hopefully I am telling you something new and useful above in return J