我对C#完全陌生,我遇到了一个错误,我无法猜到它为什么会发生。这是背景:
我有一个DataPair类,就是那个,一对数据(string,float)。我还有另一个类DataSet,它是一个DataPairs数组。
DataSet有两个私有成员:
private DataPair [] _datapair;
private int _size;
DataSet的构造函数不对_datapair执行任何操作,并将_size设置为0。
我用一个Append方法填充DataSet,它做了类似的事情:
public void Append(DataPair pair)
{
_datapair[_size] = new DataPair(pair);
_size++;
}
我从另一个方法FillFromFile:
调用Appendpublic void FillFromFile(string filepath)
{
try
{
if (System.IO.File.Exists(filepath))
{
System.IO.StreamReader sr = new System.IO.StreamReader(filepath);
string[] currentdata;
while (sr.Peek() >= 0)
{
currentdata = sr.ReadLine().Replace(',', '.').Trim().Split(';');
this.Append(new DataPair(currentdata[0], System.Convert.ToSingle(currentdata[1])));
}
sr.Close();
}
}
catch (Exception e)
{
Console.WriteLine("Error in datafile: {0}", e.ToString());
}
}
它似乎应该有效:它为每个Append创建(新)一个新的DataPair。
但是在执行函数Append中执行以下操作时出现此错误:“对象引用未设置为对象的实例”。
发生了什么事?
谢谢!
答案 0 :(得分:2)
您尚未初始化_dataPair。 _datapair = new DataPair [size];
无论如何,Append中的代码是错误的。您不能以这种方式增加数组的大小。使用List<DataPair>
代替数组可能更好。
答案 1 :(得分:1)
您的代码会创建一个新的DataPair
,但永远不会初始化DataPair
数组。因此,datapair引用null,任何取消引用它的尝试都将导致NullReferenceException
。您需要在访问它之前对其进行初始化:
_datapair = new DataPair[someSize];
我认为你会更好地使用列表,因为数组不会自动调整大小:
private readonly IList<DataPair> datapairs;
...
datapairs = new List<DataPair>();
...
datapairs.Add(new DataPair(...));
答案 2 :(得分:1)
我会像这样使用List<DataPair>
:
private readonly List<DataPair> _datapair = new List<DataPair>();
然后你的追加方法就变成了:
public void Append(DataPair pair)
{
_datapair.Add(pair);
}
答案 3 :(得分:1)
这是因为你的_dataPair数组没有实例化:
private DataPair [] _datapair = new DataPair[] { };
答案 4 :(得分:1)
可能_datapair尚未初始化。您直接调用_datapair [_size]尚未初始化。 为什么不使用Collection btw?
private List<DataPair> _datapair = new List<DataPair>();
public void Append(DataPair pair)
{
_datapair.Add(pair);
}
然后_size已过时,您可以使用_datapair.Count()
答案 5 :(得分:0)
使用列表而不是数组,因为您在编译时不知道您需要多少Datapair。
答案 6 :(得分:0)
您无需在DataPair
中创建新的Append
,因为您已在DataPair
的调用中创建了Append
对象,因此您只能执行此操作:
public void Append(DataPair pair)
{
_datapair[_size] = pair;
_size++;
}
此外,_size
是不必要的,因为所有C#数组都计算其元素。你最好使用List,或者你坚持使用数组,你可以这样做:
public void Append(DataPair pair)
{
_datapair[_datapair.Count()] = pair;
}
并且,当Append
尝试将新对象添加到不是数组的_datapair
数组但是未初始化对DataPairs数组的引用时,会引发错误。因此,如下面的答案所示,您必须初始化数组,但您必须知道其最大或想要的大小:
private DataPair [] _datapair = new DataPair[10];
由于我认为你不知道大小,你应该使用List代替你的数组。
private List<DataPair> _datapair = new List<DataPair>();
public void Append(DataPair pair)
{
_datapair.Add(pair);
}
public void FillFromFile(string filepath)
{
try
{
if (System.IO.File.Exists(filepath))
{
System.IO.StreamReader sr = new System.IO.StreamReader(filepath);
string[] currentdata;
while (sr.Peek() >= 0)
{
currentdata = sr.ReadLine().Replace(',', '.').Trim().Split(';');
this.Append(new DataPair(currentdata[0], System.Convert.ToSingle(currentdata[1])));
}
sr.Close();
}
}
catch (Exception e)
{
Console.WriteLine("Error in datafile: {0}", e.ToString());
}
}
如果您想知道列表的大小,请致电_datapair.Count()
,如果您想访问列表中的第4个元素_datapair[4] = null
。