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 }; } }
简单解释下修改点:
- 新增了私有字段
_myArray,作为属性数据的实际存储容器 get访问器返回的是私有字段_myArray,不再调用自身set访问器把值赋值给_myArray,不会触发新一轮的set调用
这样不管是构造函数里赋值,还是外部给MyArray赋值,都只会触发一次set访问器,再也不会出现无限递归导致的栈溢出了。
另外提个小细节:C#里的自动属性(比如public int[] MyArray { get; set; })其实是编译器帮你自动生成了类似_myArray的私有字段,但当你需要自定义get/set逻辑时,就必须自己显式声明私有字段,不然就会踩你现在这个递归的坑。
内容的提问来源于stack exchange,提问作者UpTide
相关产品推荐
相关产品推荐

