In alcuni nostri progetti potrebbe apparire del codice come quello che segue.
class C
{
public static C Current
{
C c_currentInstance = (C) HttpContext.Current.Cache["c_currentInstance"];
if(c_currentInstance == null)
{
c_currentInstance = new C();
HttpContext.Current.Cache.Add("c_currentInstance", c_currentInstance, [cut]);
}
return c_currentInstance;
}
}
Ogni chiamata a C.Current implica una ricerca per chiave ed un cast. Ma tutta questa burocraziona algoritmica è evitabile? Si potrebbe fare così:
class C
{
static c_currentInstance;
public static C Current
{
if(c_currentInstance == null)
{
c_currentInstance = new C();
HttpContext.Current.Cache.Add("c_currentInstance", c_currentInstance, [cut],
new CacheItemRemovedCallback(OnCacheItemRemovedCallback));
}
return c_currentInstance;
}
static void OnCacheItemRemovedCallback([cut])
{
c_currentInstance = null;
}
}
...certo le soluzioni illustrate non stanno considerando gli eventuali problemi di chiamate concorrenti, non era infatti questo il problema trattato nel corrente post. Nel caso di necessità comunque ricordate che potete "Implementare Singleton con Volatile" come proposto da Alessandro.