0

私は自分のオブジェクトにいくつかの困難を乗り越えました。私が作成したオブジェクトの配列(質問)を作成しようとしています:

public class Question
{
    public int id = 0;
    public string question = string.Empty;

    public string a1 = string.Empty;
    public string a2 = string.Empty;
    public string a3 = string.Empty;
    public string a4 = string.Empty;

    public int Tanswer = 0;

}

そして今私はこのようにそれにいくつかの値を設定しようとしています:

Question[] arr = new Question[4];

    Random rnd = new Random();

    int i = 0;
    int temp = 0;
    bool ok = false;

    while (i < 3)
    {
        temp = rnd.Next(0, Int32.Parse(dt_count.Rows[0][0].ToString()) - 1);
        for (int j = 0; j < arr.Length; j++)
        {
            arr[j].id = Int32.Parse(dt_q_notMust.Rows[temp][0].ToString());  // ID
            arr[j].question = dt_q_notMust.Rows[temp][1].ToString();  // Question
            arr[j].a1 = dt_q_notMust.Rows[temp][2].ToString();  // A1
            arr[j].a2 = dt_q_notMust.Rows[temp][3].ToString();   // A2
            arr[j].a3 = dt_q_notMust.Rows[temp][4].ToString();  // A3
            arr[j].a4 = dt_q_notMust.Rows[temp][5].ToString();  // A4
            arr[j].Tanswer = Int32.Parse(dt_q_notMust.Rows[temp][6].ToString());  // True Answer (int).

            if (arr[j].id != temp)
            {
                ok = true;

            }
        }

        if (ok)
        {
            i++;
        }
    }

そして、私がそれを初期化したことがないように、何らかの理由でエラーを書き込みます:

オブジェクト参照がオブジェクト インスタンスに設定されていません。

しかし、私は書いた:

Question[] arr = new Question[4];

だから何が問題なのかしら?

ありがとう!

4

6 に答える 6

4

新しい配列として初期化arrしましたが、その要素はすべて null のままです。アクセスする前に、各項目を初期化する必要があります。

arr[j] = new Question();
arr[j].id = Int32.Parse(dt_q_notMust.Rows[temp][0].ToString());
...
于 2012-12-04T13:00:17.643 に答える
1

配列の各オブジェクトを作成する必要があります。

Question[] arr = new Question[4];

    Random rnd = new Random();

    int i = 0;
    int temp = 0;
    bool ok = false;

    while (i < 3)
    {
        temp = rnd.Next(0, Int32.Parse(dt_count.Rows[0][0].ToString()) - 1);
        for (int j = 0; j < arr.Length; j++)
        {
            arr[j] = new Question();
            arr[j].id = Int32.Parse(dt_q_notMust.Rows[temp][0].ToString());  // ID
            arr[j].question = dt_q_notMust.Rows[temp][1].ToString();  // Question
            arr[j].a1 = dt_q_notMust.Rows[temp][2].ToString();  // A1
            arr[j].a2 = dt_q_notMust.Rows[temp][3].ToString();   // A2
            arr[j].a3 = dt_q_notMust.Rows[temp][4].ToString();  // A3
            arr[j].a4 = dt_q_notMust.Rows[temp][5].ToString();  // A4
            arr[j].Tanswer = Int32.Parse(dt_q_notMust.Rows[temp][6].ToString());  // True Answer (int).

            if (arr[j].id != temp)
            {
                ok = true;

            }
        }

        if (ok)
        {
            i++;
        }
    }
于 2012-12-04T13:01:23.050 に答える
1

作成した配列は、Question インスタンスではなく、null で埋められます。

arr[0] = new Question();
arr[1] = new Question();
arr[2] = new Question();
arr[3] = new Question();

これでうまくいきます。

于 2012-12-04T12:59:55.850 に答える
0

配列を初期化したと思いますが(実際、4つのアイテムにメモリを割り当てました)、配列内のオブジェクトは初期化していません。現在、ソリューションを試すためのVisual Studioはありませんが、初期化されたオブジェクトを使用して配列を初期化してみてください。

于 2012-12-04T13:01:08.987 に答える
0

他の人が述べているように、配列を初期化している間は、内のアイテムを初期化していませんArrayQuestiona を値型として扱う方が理にかなっている場合は、それを astructではなく aとして定義できますclass。そのようにすれば、単独で初期化するArrayだけで十分であり、その中の項目にアクセスして、必要に応じてプロパティを設定する必要はありません。アイテムを初期化します。Questionただし、クラスとして保持したい場合はArray、アイテムがアクセスされたときにアイテムを遅延初期化するクラスでラップすることができます。

public class SelfInitializingArray<T> : IEnumerable<T> where T : class
{
    private Func<T> _builder;
    private T[] _items;

    /// <summary>
    /// Initializes a new instance of the SelfInitializingArray class.
    /// </summary>
    public SelfInitializingArray(int size, Func<T> builder)
    {
        _builder = builder;
        _items = new T[size];
    }

    public IEnumerator<T> GetEnumerator()
    {
        for (int i = 0; i < _items.Length; i++)
        {
            yield return ItemOrDefaultAtIndex(i);
        }
    }

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        return this.GetEnumerator();
    }

    public T this[int index]
    {
        get
        {
            return ItemOrDefaultAtIndex(index);
        }
        set
        {
            _items[index] = value;
        }
    }

    private T ItemOrDefaultAtIndex(int index)
    {
        if (_items[index] == null)
            _items[index] = _builder();

        return _items[index];
    }
}

次に、これを次のように使用できます。

var questions = new SelfInitializingArray<Question>(4, () => new Question());

questions[0].Id = 12345; //etc.
于 2012-12-04T14:06:46.417 に答える
0

ここでは、'Question' クラスのインスタンスを含むことができる 'Array' インスタンスを作成するだけです。しかし、「質問」のインスタンスを作成していません。

次の行を追加できます。

arr[j] = new Question();

プロパティ値を設定する前。

于 2012-12-04T13:07:48.007 に答える