你调用的对象是空的。 - 但我做了初始化吗?

时间:2012-12-04 12:57:27

标签: c#

我的对象遇到了一些困难。 我试图拥有一个我创建的对象数组(问题):

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];

所以我想知道问题是什么?

谢谢!

6 个答案:

答案 0 :(得分:4)

您已将arr初始化为新数组,但其所有元素仍为空。在访问之前,您需要初始化每个项目:

arr[j] = new Question();
arr[j].id = Int32.Parse(dt_q_notMust.Rows[temp][0].ToString());
...

答案 1 :(得分:1)

您创建的数组填充了空值,而不是问题实例。

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

这样就可以了。

答案 2 :(得分: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++;
        }
    }

答案 3 :(得分:0)

我认为你已经初始化了数组(实际上,你为4个项目分配了一些内存)但不是数组中的对象。我现在没有可视化工作室来尝试解决方案,但您可以尝试使用初始化对象初始化数组。

答案 4 :(得分:0)

所以在这里你只需创建一个'Array'实例,它可以包含类'Question'的实例。但是你没有创建任何“问题”的实例。

您可以添加以下行:

arr[j] = new Question();

在设置属性值之前。

答案 5 :(得分:0)

正如其他人所说,虽然您已初始化阵列,但尚未初始化Array内的项目。如果将Question视为值类型更有意义,则可以将其定义为struct而不是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.