我正在尝试这样的事情:
class point
{
public int x;
public int y;
}
point[] array = new point[100];
array[0].x = 5;
这是错误: 未将对象引用设置为对象的实例。 (@最后一行)
怎么了? :P
答案 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()