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

C#中避免数组递归设置:实例化类时栈溢出问题求助

解决C#属性赋值时的栈溢出问题

兄弟,你这栈溢出的问题根源太明显了——你的MyArray属性在get和set访问器里直接操作了属性本身,导致无限递归调用,把栈撑爆了!

咱们来拆解下问题:

  • 当你在构造函数里执行this.MyArray = new int[2] { 0, 0 };时,会触发set访问器
  • 而set里又写了MyArray = value;,这又会再次触发set访问器,无限循环下去
  • 同理,get访问器里return MyArray;也会不断调用自己,只要你访问这个属性就会递归

要解决这个问题,核心是用私有字段来存储属性的实际值,而不是让属性直接操作自己。修改后的代码如下:

class MyClass { 
    // 私有字段,用来存储数组的实际数据
    private int[] _myArray;

    public int[] MyArray { 
        get { return _myArray; } // 返回私有字段的值,不会递归
        set { 
            if (value == null) { 
                _myArray = new int[2] { 0, 0 }; 
            } else { 
                _myArray = value; 
            } 
        } 
    } 

    public MyClass() { 
        this.MyArray = new int[2] { 0, 0 }; 
    } 
}

简单解释下修改点:

  1. 新增了私有字段_myArray,作为属性数据的实际存储容器
  2. get访问器返回的是私有字段_myArray,不再调用自身
  3. set访问器把值赋值给_myArray,不会触发新一轮的set调用

这样不管是构造函数里赋值,还是外部给MyArray赋值,都只会触发一次set访问器,再也不会出现无限递归导致的栈溢出了。

另外提个小细节:C#里的自动属性(比如public int[] MyArray { get; set; })其实是编译器帮你自动生成了类似_myArray的私有字段,但当你需要自定义get/set逻辑时,就必须自己显式声明私有字段,不然就会踩你现在这个递归的坑。

内容的提问来源于stack exchange,提问作者UpTide

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:59:49