Node类Setter方法为何失效?触发IndexOutOfRangeException异常
问题分析与解决
IndexOutOfRangeException 异常原因
触发这个异常是因为索引越界:
Node类的datas数组长度为10,有效索引范围是0~9。Add方法中,index是静态变量,每次调用Add就直接执行index++,完全没有检查是否已到达当前Node数组的上限(索引9)。当index增长到10时,执行last.datas[index] = data会访问datas[10],直接触发索引越界异常。
Ignite 属性Setter未生效的原因
你的预期是通过Ignite的Setter创建新Node,但当前代码从未触发过这个Setter:
- Setter只有在执行
Ignite = 某个值时才会被调用,而你仅在Node构造函数中写了datas[9] = Ignite;——这是读取Ignite的getter,不会触发setter逻辑。 Add方法中没有判断逻辑:当填充到当前Node数组的最后一个位置(index=9)时,去调用Ignite的赋值操作,自然不会创建新的Node。
静态变量的设计错误
index和last被定义为static,这意味着所有DynamicArray实例会共享同一个索引和最后节点,完全违背了动态数组的实例隔离要求,会导致多个实例的操作互相干扰。
修正后的代码示例
public class DynamicArray { // 移除static修饰符,每个实例拥有独立的索引和最后节点 private int _index = 0; public Node Head { get; private set; } private Node _last; public DynamicArray() { Head = new Node(); _last = Head; } public class Node { public object[] Datas = new object[10]; private object _ignite; public Node? Next { get; private set; } public object Ignite { get { return _ignite; } set { Next = new Node(); _ignite = value; } } } public void Add(object data) { // 检查是否到达当前节点数组的容量上限 if (_index >= _last.Datas.Length) { // 触发Ignite的Setter,创建新节点 _last.Ignite = new object(); // 切换到新节点并重置索引 _last = _last.Next; _index = 0; } _last.Datas[_index] = data; _index++; } }
内容的提问来源于stack exchange,提问作者Can
相关产品推荐
相关产品推荐

