C#中的惰性字典属性

时间:2012-04-03 23:31:05

标签: c# properties lazy-initialization

我有一个具有字典属性的类:

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

我想切换此属性以使用延迟初始化。我尝试了以下方法:

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

这当然是一个错误,因为名称和名称有不同的类型。但是对于我的生活,我无法弄清楚如何正确指定。我真正想要的是让Name保持为null,直到我访问它,然后在第一次读或写时创建它。

2 个答案:

答案 0 :(得分: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;
        }
    }

编辑:请注意,此方法会有一些线程安全问题。检查这是否对您有用。

答案 1 :(得分: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;
        }
    }
}