在c#中初始化字典返回溢出错误

时间:2017-04-01 13:12:04

标签: c# dictionary

我可以看到你创建了一个字典:

public Dictionary<string, string> TipList
{
    get { return TipList; }
    set { TipList = value; }
}

我从服务中获取一些数据,我想将这些数据放入我的字典中,如下所示:

Dictionary<string, string> dict = new Dictionary<string, string>();
try
{
    using (var response = (HttpWebResponse)request.GetResponse())
    {

        using (var reader = new StreamReader(response.GetResponseStream()))
        {
            var objText = reader.ReadToEnd();
            var list = JsonConvert.DeserializeObject<List<Dictionary<string, string>>>(objText).ToDictionary(x => x.Keys, x => x.Values);
            object o;
            object o1;
            foreach (var item in list)
            {
                o = item.Value.ElementAt(0);
                o1 = item.Value.ElementAt(1);
                dict.Add(o.ToString(), o1.ToString());
            }
            GlobalVariable.TipListCache.Add(NewCarReceiption.CSystem.Value, dict);
            NewCarReceiption.TipList = dict.Where(i=>i.Key!=null & i.Value!=null).ToDictionary(x => x.Key, x => x.Value);
        }
    }
}

但是在上面的函数试图将他们的数据放入我的字典后运行我的代码。我的应用程序返回此错误:

enter image description here

2 个答案:

答案 0 :(得分:3)

你的setter正在调用TipList属性的setter(本身),它正在调用它的setter等等 - 导致异常。

像这样初始化:

private Dictionary<string, string> _tipList;
public Dictionary<string, string> TipList
{
    get { return _tipList; }
    set { _tipList = value; }
}

或者最好,如果您不需要默认行为,请使用auto-implemented property

public Dictionary<string, string> TipList { get; set; }

从C#6.0开始,您也可以像这样初始化它(使用自动属性初始值设定项):

public Dictionary<string, string> TipList { get; set; } = new Dictionary<string, string>();

答案 1 :(得分:1)

你一遍又一遍地设置相同的属性,进入无限循环。

如果你的getter和setter中不需要任何额外的逻辑,你可能会让它自动实现:

public Dictionary<string, string> TipList
{
   get;
   set;
}

如果你的getter和setter中需要更多逻辑,你必须自己添加一个支持字段:

private Dictionary<string, string> tipList;
public Dictionary<string, string> TipList
{
    get
    {
        DoSomethingBeforeGet();
        return this.tipList;
    }
    set
    {
        DoSomethingBeforeSet();
        this.tipList = value;
        DoSomethingAfterSet();
    }
}