分离Card列表时触发Stack Overflow Exception,如何修复?
问题分析与解决方案
1. 栈溢出的直接原因
你的cards属性存在无限递归调用:
get访问器直接返回cards,会不断触发自身调用,最终导致栈溢出。set里执行cards.Remove(linesorgu)时,会调用get访问器,同样陷入递归循环。- 循环内的
cards = value会反复触发set访问器,进一步加剧递归问题。
2. 修复步骤
步骤1:用私有字段存储数据
给属性配套私有字段,避免递归调用:
// 私有字段存储实际卡片数据 private static List<Card>? _cards; public static List<Card>? cards { get { return _cards; // 返回私有字段,而非属性本身 } set { _cards = value; // 直接赋值给私有字段,无复杂逻辑 } }
步骤2:将分类逻辑移到方法中
你的需求是把Card实例分到不同列表,属于复杂业务逻辑,不适合放在属性的set里,单独写方法更清晰:
public static void ClassifyCards(List<Card> inputCards) { // 清空原有列表(按需选择是否保留此操作) done.Clear(); InProg.Clear(); todo.Clear(); _cards?.Clear(); _cards ??= new List<Card>(); foreach (var card in inputCards) { var lineLower = card.line.ToLower(); if (card.line == "3" || lineLower == "done") { done.Add(card); } else if (card.line == "2" || lineLower == "inprog") { InProg.Add(card); } else if (card.line == "1" || lineLower == "todo") { todo.Add(card); } else { Console.WriteLine("Line yazımında bir yanlış var"); // 不符合分类的卡片存入cards列表 _cards.Add(card); } } }
步骤3:替换原有调用方式
原来写cards = someCardList的地方,改成调用ClassifyCards(someCardList)即可。
3. 属性与方法的选择建议
- 属性:仅用于简单的状态读写,语义上代表对象的某个状态,不能包含修改其他数据、输出日志这类副作用。
- 方法:适合执行有明确动作的复杂逻辑,方法名能清晰表达操作意图(比如
ClassifyCards),可读性和可维护性更强。
内容的提问来源于stack exchange,提问作者İnanAkalin
相关产品推荐
相关产品推荐

