我正在尝试这样的事情:
class point
{
public int x;
public int y;
}
point[] array = new point[100];
array[0].x = 5;
这是错误: 对象引用未设置为对象的实例。(@最后一行)
怎么了?:P
它只创建数组,但所有元素都用 null 初始化。
您需要一个循环或类似的东西来创建您的类的实例。(在这种情况下,foreach 循环不起作用)示例:
point[] array = new point[100];
for(int i = 0; i < 100; ++i)
{
array[i] = new point();
}
array[0].x = 5;
当你这样做
point[] array = new point[100];
您创建一个数组,而不是 100 个对象。数组元素为空。此时您必须创建每个元素:
array[0] = new point();
array[0].x = 5;
您可以更改class point
为struct point
在这种情况下new point[500]
将创建一个初始化为的点数组0,0
(而不是空数组)。
正如其他答案所解释的,您需要在每个数组位置初始化对象。您可以使用如下方法创建预初始化数组
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 版本都很简单,但我相信效率略低
int[] asd = new int[99];
for (int i = 0; i < 100; i++)
asd[i] = i;
类似的东西?
有时 LINQ 会派上用场。它可能会提供一些额外的可读性并减少样板和重复。缺点是需要额外的分配:创建枚举器并且 ToArray 事先不知道数组大小,因此可能需要多次重新分配内部缓冲区。仅在可维护性比其性能更重要的代码中使用。
using System.Linq;
const int pointsCount = 100;
point[] array = Enumerable.Range(0, pointsCount)
.Select(_ => new point())
.ToArray()