C# 从默认构造函数在静态类中添加实例类时出现堆栈溢出异常 公共类表单 { 内部静态字典缓存=新建 字典(); 公共字符串FormID{get;set;}=string.Empty; 公共表格() { 如果(!Cache.ContainsKey(FormID)) Add(FormID,newform()); //此处出现异常,因为总是再次调用新表单() } }
我想在缓存中创建类窗体对象的实例。如果缓存包含FormID属性,那么静态字典缓存将不会发生任何事情 缓存必须为表单中具有唯一FormID的每个实例保存单个实例。这意味着每个表单实例在缓存中都有一个具有相同FormID的实例。因此,通过克隆缓存创建新实例将非常快。这就是我需要做的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
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();
}
}