Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C语言中的惰性字典属性#_C#_Properties_Lazy Initialization - Fatal编程技术网

C# C语言中的惰性字典属性#

C# C语言中的惰性字典属性#,c#,properties,lazy-initialization,C#,Properties,Lazy Initialization,我有一个属性为字典的类: public class Entity { public Dictionary<string, string> Name { get; set; } } 公共类实体 { 公共词典名称{get;set;} } 我想将此属性切换为使用惰性初始化。我尝试了以下方法: public class Entity { private Lazy<Dictionary<string, string>> name

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

public class Entity 
{
        public Dictionary<string, string> Name { get; set; }
}
公共类实体
{
公共词典名称{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;
            }
        }
}
公共类实体
{
private Lazy name=new Lazy(()=>newdictionary(StringComparer.OrdinalIgnoreCase));
公共字典名
{
得到
{
返回名称;
}
设置
{
名称=值;
}
}
}

这当然是一个错误,因为Name和Name有不同的类型。然而,就我的一生而言,我不知道如何正确地指定这一点。我真正想要的是让Name保持为null,直到我访问它,然后在第一次读写时创建它

您可以将初始化与
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;
        }
    }
private Dictionary\u name;
公共字典名
{
得到
{
如果(_name==null)
_name=新字典();
返回_name;
}
设置
{
_名称=值;
}
}

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

名称。值为只读。试试这个:

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;
        }
    }
}
公共类实体
{
私有名称=
新懒汉(
()=>新字典(StringComparer.OrdinalIgnoreCase));
公共字典名
{
得到
{
返回name.Value;
}
}
}

这里有一个竞赛条件。是的,我添加了一个关于这一点的注释,可能是在你输入评论时添加的。;)哦,看起来我在用我的手机。这就是当我迷恋一个很酷的功能时发生的事情。谢谢,我会尽快将此标记为答案,让我来回答。现在,因为我有一堆这样的东西,我只需要为它们做一些工厂。或者只是
获取{return\u name??(\u name=new Dictionary());}
是的,这是一个很好的一行,但是有些人不喜欢在返回中指定。我猜你会失去一些可读性。Lazy.Value属性是只读的:如果你的意思是你的需求是读写属性,那么上面的解决方案是不完整的。[意识到这个问题已经8年了]与你所追求的类似?