You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

分离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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 14:02:08