我的对象遇到了一些困难。 我试图拥有一个我创建的对象数组(问题):
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];
所以我想知道问题是什么?
谢谢!
答案 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.