2012-04-03 6 views
8

Ho una classe con una proprietà che è un dizionario:pigri proprietà del dizionario in C#

public class Entity 
{ 
     public Dictionary<string, string> Name { get; set; } 
} 

Vorrei cambiare questa proprietà per usare initializtion pigro. Ho provato il seguente:

public class Entity 
{ 
     private Lazy<Dictionary<string, string>> name = new Lazy<Dictionary<string, string>>(() => new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)); 
     public Dictionary<string, string> Name 
     { 
      get 
      { 
       return name; 
      } 
      set 
      { 
       name = value; 
      } 
     } 
} 

Questo è ovviamente un errore, come Nome e nome hanno tipi diversi. Per la vita di me, però, non riesco a capire come specificarlo correttamente. Tutto quello che voglio veramente è che il nome rimanga nullo finché non accedo, quindi lo creo alla prima lettura o scrittura.

risposta

10

È possibile utilizzare l'inizializzazione con Lazy, ma ciò che si vuole è piuttosto semplice e si potrebbe semplicemente fare questo

private Dictionary<string, string> _name; 
    public Dictionary<string, string> Name 
    { 
     get 
     { 
      if(_name == null) 
       _name = new Dictionary<string, string>(); 
      return _name; 
     } 
     set 
     { 
      _name = value; 
     } 
    } 

EDIT: Si noti che questo approccio avrà alcuni problemi di sicurezza thread. Controlla se questo può essere un problema per te.

+0

Hai una condizione di gara lì. – LukeH

+0

Sì aggiunto ho aggiunto una nota su questo probabilmente stavate scrivendo il tuo commento. ;) – Vache

+1

D'oh, sembra che stavo usando [i guanti di complicator] mia (http://thedailywtf.com/Articles/The_Complicator_0x27_s_Gloves.aspx). Questo è ciò che accade quando mi innamoro di una caratteristica interessante. Grazie, segnerò questa come risposta, non appena me lo consentirà. Ora, perché ho un sacco di questi, ho solo bisogno di creare una sorta di fabbrica per loro. –

7

name.Value è di sola lettura. Prova questo:

public class Entity 
{ 
    private Lazy<Dictionary<string, string>> name = 
     new Lazy<Dictionary<string, string>>(
      () => new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)); 

    public Dictionary<string, string> Name 
    { 
     get 
     { 
      return name.Value; 
     } 
    } 
} 
+0

È in lettura e scrittura. –

+1

La proprietà pigro .Value è di sola lettura: http://msdn.microsoft.com/en-us/library/dd642177.aspx Se vuoi dire che il requisito è per una proprietà di lettura-scrittura, allora la soluzione di cui sopra è incompleto. – bouvierr