J'ai le modèle singleton C# suivant, y a-t-il un moyen de l'améliorer ?
public class Singleton<T> where T : class, new()
{
private static object _syncobj = new object();
private static volatile T _instance = null;
public static T Instance
{
get
{
if (_instance == null)
{
lock (_syncobj)
{
if (_instance == null)
{
_instance = new T();
}
}
}
return _instance;
}
}
public Singleton()
{ }
}
Exemple d'utilisation préférée :
class Foo : Singleton<Foo>
{
}
Related :
0 votes
En l'état actuel des choses, j'ai dû ajouter "protected" au constructeur pour pouvoir compiler.
0 votes
La question est difficile à lire. Est-ce que "Cette classe Singleton générique est bonne ? Est-ce qu'elle est thread safe ?" donne-t-il toujours le bon sens ?
0 votes
N'hésitez pas à faire ce que vous voulez de cette question, c'est un wiki communautaire.
1 votes
Un problème avec tout Singleton basé sur une propriété d'instance est que vous devez faire attention si le constructeur de votre classe a des effets secondaires. Si vous survolez la propriété Instance dans le débogueur alors que vous êtes au milieu de la construction du singleton (parce que vous avez défini un point d'arrêt dans l'un des effets secondaires, par exemple), vous pouvez en fait exécuter à nouveau le constructeur et causer toutes sortes de problèmes stupéfiants. Cela se produit parce que le débogueur (par défaut) évalue automatiquement les propriétés lorsque vous les survolez.