数组实例化错误

时间:2015-08-04 00:34:05

标签: c# arrays initialization

我有两个班级:

public class SubObject {
    public int id;
}

public class Object {
    public SubObject[] SubObjects;
}

我有一个阵列:

public Object[] Objects;

当我尝试实例化这个数组时:

public void InstantiateArrays(int objectsSize, int subObjectsSize) {
    Objects = new Object[objectsSize];
    foreach (Object obj in Objects) {
        obj.SubObjects = new SubObject[subObjectsSize];
    }
}

我收到此错误:

  

发生了'System.NullReferenceException'类型的异常   ****但未在用户代码中处理

     

附加信息:未将对象引用设置为对象的实例。

2 个答案:

答案 0 :(得分:1)

这是无效的:

Objects = new Object[objectsSize];
foreach (Object obj in Objects) {

这是因为第一行将创建一个由null引用组成的数组,这是C#中Object引用的默认值。使用foreach不允许您覆盖引用。

您需要使用数组索引来设置数组元素:

for(int i = 0; i < this.Objects.Length; i++ ) {
    this.Objects[i] = new SubObject[ subObjectSize ];
}

请注意,使用Object通常是一个坏主意,因为它会强制您使用强制转换。如果你有一个分层对象hiearchy然后使用强类型或更好:适当的泛型。

答案 1 :(得分:1)

在这一行:

Objects = new Object[objectsSize];

您创建一个数组。数组的元素被初始化为类型的默认值。由于它是对象的数组,因此默认值为null

在循环中,您尝试访问SubObjects对象的字段null

obj.SubObjects = new SubObject[objectsSize];

快速解决方法是使用for循环并实例化循环中的对象:

for (int i = 0; i < subObjectSize; i++)
{
    Objects[i] = new Object();
    Objects[i].SubObjects = new SubObject[subObjectsSize];
}

另请注意,命名其中一个类Object是不好的做法,因为这是对象层次结构的类的名称。