4

我正在尝试这样的事情:

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

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

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

怎么了?:P

4

6 回答 6

12

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

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

array[0].x = 5;
于 2012-04-18T13:08:12.130 回答
7

当你这样做

point[] array = new point[100];

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

array[0] = new point();
array[0].x = 5;
于 2012-04-18T13:09:03.770 回答
6

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

于 2012-04-18T13:09:45.230 回答
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 版本都很简单,但我相信效率略低

于 2012-04-18T13:17:29.203 回答
1
int[] asd = new int[99];
for (int i = 0; i < 100; i++)
    asd[i] = i;

类似的东西?

于 2012-04-18T13:19:43.950 回答
0

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

using System.Linq;

const int pointsCount = 100;
point[] array = Enumerable.Range(0, pointsCount)
    .Select(_ => new point())
    .ToArray()
于 2020-02-13T16:14:46.560 回答