2012-04-03 19 views
8

que tienen una clase con una propiedad que es un diccionario:Lazy propiedades del diccionario en C#

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

me gustaría cambiar esta propiedad a utilizar initializtion perezoso. Intenté lo siguiente:

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; 
      } 
     } 
} 

Esto es, por supuesto, un error, ya que Nombre y nombre tienen diferentes tipos. Sin embargo, por mi vida, no puedo encontrar la manera de especificar esto correctamente. Todo lo que realmente quiero es que Name permanezca nulo hasta que acceda a él, luego créelo en la primera lectura o escritura.

Respuesta

10

Puede utilizar la inicialización con Lazy, pero lo que quiere es bastante simple y se puede simplemente hacer esto

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: Tenga en cuenta que este enfoque tendrá algunos problemas de seguridad hilo. Comprueba si esto puede ser un problema para ti.

+0

Tiene una condición de carrera allí. – LukeH

+0

Sí, agregado Agregué una nota sobre esto probablemente mientras escribía su comentario. ;) – Vache

+1

D'oh, parece que estaba usando mis [guantes de complicador] (http://thedailywtf.com/Articles/The_Complicator_0x27_s_Gloves.aspx). Esto es lo que sucede cuando me enamoro de una característica genial. Gracias, marcaré esto como la respuesta tan pronto como SO me lo permita. Ahora, debido a que tengo un montón de estos, solo necesito hacer una especie de fábrica para ellos. –

7

name.Value es de solo lectura. Pruebe esto:

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

Es de lectura y escritura. –

+1

La propiedad Lazy .Value es de solo lectura: http://msdn.microsoft.com/en-us/library/dd642177.aspx Si quiere decir que su requisito es una propiedad de lectura-escritura, entonces la solución anterior está incompleto – bouvierr

Cuestiones relacionadas