如何创建100个新对象的数组?

时间:2012-04-18 13:07:04

标签: c# arrays

我正在尝试这样的事情:

class point
{
public int x;
public int y;
}

point[] array = new point[100];
array[0].x = 5;

这是错误: 未将对象引用设置为对象的实例。 (@最后一行)

怎么了? :P

6 个答案:

答案 0 :(得分:11)

它只创建数组,但所有元素都用null初始化 您需要一个循环或类似的东西来创建您的类的实例。 (在这种情况下,foreach循环不起作用) 例如:

point[] array = new point[100];
for(int i = 0; i < 100; ++i)
{
    array[i] = new point();
}

array[0].x = 5;

答案 1 :(得分:6)

当你这样做时

point[] array = new point[100];

你创建一个数组,而不是100个对象。数组的元素为null。此时你必须创建每个元素:

array[0] = new point();
array[0].x = 5;

答案 2 :(得分:6)

在这种情况下,您可以将class point更改为struct point new point[500]将创建一个初始化为0,0的点数组(而不是null的数组)。

答案 3 :(得分:1)

正如其他答案所解释的那样,您需要初始化每个阵列位置的对象。您可以使用如下方法创建预初始化的数组

T[] CreateInitializedArray<T>(int size) where T : new()
{
    var arr = new T[size];
    for (int i = 0; i < size; i++)
        arr[i] = new T();
    return arr;
}

如果你的类没有无参数构造函数,你可以使用类似的东西:

T[] CreateInitializedArray<T>(int size, Func<T> factory)
{
    var arr = new T[size];
    for (int i = 0; i < size; i++)
        arr[i] = factory();
    return arr;
}

两种方法的LINQ版本都很简单,但我相信效率稍差

答案 4 :(得分:1)

int[] asd = new int[99];
for (int i = 0; i < 100; i++)
    asd[i] = i;

那样的东西?

答案 5 :(得分:-1)

有时LINQ会派上用场。它可以提供一些额外的可读性,并减少样板和重复。缺点是需要额外的分配:创建了枚举数,并且ToArray事先不知道数组的大小,因此它可能需要多次重新分配内部缓冲区。 仅在其可维护性比其性能更关键的代码中使用。

using System.Linq;

const int pointsCount = 100;
point[] array = Enumerable.Range(0, pointsCount)
    .Select(_ => new point())
    .ToArray()