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個のオブジェクトではなく、配列を作成します。配列の要素はnullです。その時点で、各要素を作成する必要があります。

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

その場合、に変更class pointすると、 (null の配列ではなく)初期化されたポイントの配列が作成されます。struct pointnew 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 に答える