从默认构造函数中添加静态类中的实例类时出现Stack-Overflow异常

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从默认构造函数中添加静态类中的实例类时出现Stack-Overflow异常相关的知识,希望对你有一定的参考价值。

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中创建类Form的对象实例。如果Cache包含FormID属性,则静态字典Cache不会发生任何事情。

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

Camilo Terevinto在下面回答得很好。

答案

这段代码没有意义:

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

您将始终检查/添加FormId的默认值。有了这个,你在该词典中只会有一个键/值对,所以使用词典会很浪费。

您应该为此使用工厂方法,并保留默认构造函数:

private Form()
{
}

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

    return Cache[formId].DeepClone();  // using DeepCloner extension
}
另一答案

你可能想在this中添加Cache

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实例。

以上是关于从默认构造函数中添加静态类中的实例类时出现Stack-Overflow异常的主要内容,如果未能解决你的问题,请参考以下文章

想调用父类中的有参构造函数

使用基类中定义的函数返回指向派生类实例的指针时出现无效转换错误

在静态类中的记录器上使用锁时出现异常

如何将对象添加到类中的静态向量

c# 有调用一个类的静态方法,是不是执行这个类的构造函数

2017-4-16 多态 构造函数 方法重载 静态方法和静态成员