2012-04-03 2 views
8

У меня есть класс со свойством, что это словарь:Ленивые словарные свойства в C#

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

Я хотел бы переключить это свойство использовать ленивую initializtion. Я пробовал следующее:

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

Это, конечно, ошибка, так как имя и имя имеют разные типы. Для жизни меня, однако, я не могу понять, как правильно это указать. Все, что я действительно хочу, это иметь имя, которое остается равным null, пока я не получу доступ к нему, а затем создам его при первом чтении или записи.

ответ

10

Вы можете использовать инициализацию с Lazy, но что вы хотите это довольно просто, и вы могли бы просто сделать это

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: Обратите внимание, что этот подход будет иметь некоторые проблемы безопасности нити. Проверьте, может ли это быть проблемой для вас.

+0

У вас есть состояние гонки. – LukeH

+0

Да, я добавил примечание об этом, возможно, когда вы вводили свой комментарий. ;) – Vache

+1

D'oh, похоже, я использовал свои перчатки [complicator's] (http://thedailywtf.com/Articles/The_Complicator_0x27_s_Gloves.aspx). Это то, что происходит, когда я влюбляюсь в классную особенность. Спасибо, я буду отмечать это как ответ, как только SO позволяет мне. Теперь, потому что у меня их куча, мне просто нужно сделать для них какую-то фабрику. –

7

name.Value предназначен только для чтения. Попробуйте следующее:

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

Это чтение-запись. –

+1

Lazy . Свойство Value доступно только для чтения: http://msdn.microsoft.com/en-us/library/dd642177.aspx Если вы имеете в виду, что ваше требование предназначено для свойства чтения-записи, то решение выше является неполным. – bouvierr

Смежные вопросы