Simon Hughes Simon Hughes - 3 months ago 13
C# Question

A generic singleton

What do you guys think about this for a generic singleton?

using System;
using System.Reflection;

// Use like this
/*
public class Highlander : Singleton<Highlander>
{
private Highlander()
{
Console.WriteLine("There can be only one...");
}
}
*/

public class Singleton<T> where T : class
{
private static T instance;
private static object initLock = new object();

public static T GetInstance()
{
if (instance == null)
{
CreateInstance();
}

return instance;
}

private static void CreateInstance()
{
lock (initLock)
{
if (instance == null)
{
Type t = typeof(T);

// Ensure there are no public constructors...
ConstructorInfo[] ctors = t.GetConstructors();
if (ctors.Length > 0)
{
throw new InvalidOperationException(String.Format("{0} has at least one accesible ctor making it impossible to enforce singleton behaviour", t.Name));
}

// Create an instance via the private constructor
instance = (T)Activator.CreateInstance(t, true);
}
}
}
}

Answer

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.