A generic singleton
Creating a singleton class is just a few lines of code, and with the difficulty of making a generic singleton i always write those lines of code.
public class Singleton
{
private Singleton() {}
static Singleton() {}
private static Singleton _instance = new Singleton();
public static Singleton Instance { get { return _instance; }}
}
The
private static Singleton _instance = new Singleton();
line removes the need for locking, as a static constructor is thread safe.
Well, it isn't really singleton - since you can't control T
, there can be as many T
instances as you like.
(removed thread-race; noted the double-checked usage)
I've deleted my previous answer as I hadn't noticed the code which checks for non-public constructors. However, this is a check which is only performed at execution time - there's no compile-time check, which is a strike against it. It also relies on having enough access to call the non-public constructor, which adds some limitations.
In addition, it doesn't prohibit internal constructors - so you can end up with non-singletons.
I'd personally create the instance in a static constructor for simple thread safety, too.
Basically I'm not much of a fan - it's pretty easy to create singleton classes, and you shouldn't be doing it that often anyway. Singletons are a pain for testing, decoupling etc.