Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.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# 从默认构造函数在静态类中添加实例类时出现堆栈溢出异常 公共类表单 { 内部静态字典缓存=新建 字典(); 公共字符串FormID{get;set;}=string.Empty; 公共表格() { 如果(!Cache.ContainsKey(FormID)) Add(FormID,newform()); //此处出现异常,因为总是再次调用新表单() } }_C#_.net_Stack Overflow_Default Constructor - Fatal编程技术网

C# 从默认构造函数在静态类中添加实例类时出现堆栈溢出异常 公共类表单 { 内部静态字典缓存=新建 字典(); 公共字符串FormID{get;set;}=string.Empty; 公共表格() { 如果(!Cache.ContainsKey(FormID)) Add(FormID,newform()); //此处出现异常,因为总是再次调用新表单() } }

C# 从默认构造函数在静态类中添加实例类时出现堆栈溢出异常 公共类表单 { 内部静态字典缓存=新建 字典(); 公共字符串FormID{get;set;}=string.Empty; 公共表格() { 如果(!Cache.ContainsKey(FormID)) Add(FormID,newform()); //此处出现异常,因为总是再次调用新表单() } },c#,.net,stack-overflow,default-constructor,C#,.net,Stack Overflow,Default Constructor,我想在缓存中创建类窗体对象的实例。如果缓存包含FormID属性,那么静态字典缓存将不会发生任何事情 缓存必须为表单中具有唯一FormID的每个实例保存单个实例。这意味着每个表单实例在缓存中都有一个具有相同FormID的实例。因此,通过克隆缓存创建新实例将非常快。这就是我需要做的 Camilo Terevinto下面回答得很好。这个代码没有意义: public class Form { internal static Dictionary<string, Form> Cache

我想在缓存中创建类窗体对象的实例。如果缓存包含FormID属性,那么静态字典缓存将不会发生任何事情

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


Camilo Terevinto下面回答得很好。

这个代码没有意义:

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
    }
}
您将始终检查/添加
FormId
的默认值。这样,字典中就永远只有一个键/值对,所以使用字典将是一种浪费

对此,您应该使用工厂方法,并且不要使用默认构造函数:

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

您可能需要在
缓存中添加

private Form()
{
}

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

    return Cache[formId].DeepClone();  // using DeepCloner extension
}
公共类表单
{
内部静态字典缓存=新建
字典();
公共字符串FormID{get;private set;}
公共表单(字符串formID)
{
this.FormID=FormID;
如果(!Cache.ContainsKey(formID))

Cache.Add(formID,this);//事实上,我更惊讶的是它抛出堆栈溢出而不是null arg,因为FormID始终为null。问题是在实际添加到缓存之前创建了一个新表单。因此它最终会出现无休止的循环OK?给出一个解决方案。缓存必须为表单中具有唯一FormID的每个实例保存一个实例。这意味着每个rm instance在缓存中有一个具有相同FormID的实例。因此,通过克隆缓存创建新实例会很快。这就是我需要做的。我在一篇评论中建议了这一点,OP说他们需要一个新实例,而不是
this
@CamiloTerevinto我看不到您引用的评论。我在OP回答后删除了,但OP删除了他们的coM也很抱歉是的,@Tgheodor这意味着缓存[此表单]如果静态表单发生更改,将成为目标。我需要的是将每个表单实例分开,在缓存中只有一个静态表单!为了重复使用,请将它们克隆到具有相同FormID的新实例中!即it@kokowawa因此,您不希望有两个
Form
实例具有相同的
FormID
?那么您不应该将此代码放入
表单
的构造函数。您必须有一个静态工厂方法来创建请求的表单,或者从
缓存
@kokowawa返回一个现有的表单。是的,假设您将它们正确地添加到字典中,这不是浪费。我说过如果您只使用单个
表单
为什么忽略默认构造函数ctor!我爱死它了为什么你要杀了我的爱?@kokowawa因为你需要一个不与缓存交互的构造函数,因为你需要FormId作为缓存键传递OK!你是被选中的!哦,等等,请把缓存深度克隆到具有相同FormId的表单的新实例中怎么样?我的意思是应该在
cache.ContainsKey
i之后n构造函数插入此行?
this=Cache[FormID].DeepClone();
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();
    }
}