首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从默认构造函数在静态类中添加实例类时发生堆栈溢出异常

从默认构造函数在静态类中添加实例类时发生堆栈溢出异常
EN

Stack Overflow用户
提问于 2019-04-25 00:37:44
回答 2查看 82关注 0票数 -1
代码语言:javascript
复制
public class Form
{
    internal static Dictionary<string, Form> Cache = new 
     Dictionary<string, Form>();
    public string FormID{get;set;} = string.Empty;

    public Form()
    {
        if (!Cache.ContainsKey(FormID))
            Cache.Add(FormID, new Form());

       // exception here because new Form() is always called again
    }
}

我想在Cache中创建类形式的对象的实例。如果缓存包含FormID属性,则静态字典缓存不会发生任何变化。

缓存必须为具有唯一FormID的表单中的每个实例保留单个实例。这意味着每个表单实例在缓存中都有具有相同FormID的实例。因此,通过克隆缓存创建新实例的速度会很快。这就是我需要做的。

Camilo Terevinto下面很好地回答了这个问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-25 00:48:18

这段代码没有任何意义:

代码语言:javascript
复制
if (!Cache.ContainsKey(FormID))
    Cache.Add(FormID, new Form());

您将始终检查/添加FormId的默认值。这样,该Dictionary中将只有一个键/值对,因此使用Dictionary将是一种浪费。

为此,您应该使用工厂方法,而不使用默认构造函数:

代码语言:javascript
复制
private Form()
{
}

public static Form BuildForm(string formId)
{
    if (!Cache.ContainsKey(formId))
    {
        Cache.Add(formId, new Form());
    }

    return Cache[formId].DeepClone();  // using DeepCloner extension
}
票数 1
EN

Stack Overflow用户

发布于 2019-04-25 01:06:13

您可能希望在Cache中添加this

代码语言:javascript
复制
public class Form
{
    internal static Dictionary<string, Form> Cache = new
        Dictionary<string, Form>();

    public string FormID { get; private set; }

    public Form(string formID)
    {
        this.FormID = formID;
        if (!Cache.ContainsKey(formID))
            Cache.Add(formID, this); // <--- this instead of new Form();
    }
}

this是指当前构造的Form实例。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55834831

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档