私はそのようなことを試みています:
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個のオブジェクトではなく、配列を作成します。配列の要素はnullです。その時点で、各要素を作成する必要があります。
array[0] = new point();
array[0].x = 5;
その場合、に変更class point
すると、 (null の配列ではなく)初期化されたポイントの配列が作成されます。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()