C# 在初始化时,它会说;对象引用未设置为对象的实例;
我对C#完全是新手,我有一个错误,我猜不出它为什么会发生。这就是背景: 我有一个DataPair类,就是一对数据(string,float)。我还有另一个类DataSet,它是一个数据对数组 数据集有两个私有成员:C# 在初始化时,它会说;对象引用未设置为对象的实例;,c#,C#,我对C#完全是新手,我有一个错误,我猜不出它为什么会发生。这就是背景: 我有一个DataPair类,就是一对数据(string,float)。我还有另一个类DataSet,它是一个数据对数组 数据集有两个私有成员: private DataPair [] _datapair; private int _size; DataSet的构造函数不处理_数据对,并将_大小设置为0 我用一个方法Append填充数据集,其作用如下: public void Append(DataPair pair) {
private DataPair [] _datapair;
private int _size;
DataSet的构造函数不处理_数据对,并将_大小设置为0
我用一个方法Append填充数据集,其作用如下:
public void Append(DataPair pair)
{
_datapair[_size] = new DataPair(pair);
_size++;
}
private readonly List<DataPair> _datapair = new List<DataPair>();
我从另一个方法FillFromFile调用Append:
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());
}
}
它似乎应该可以工作:它为每个附加创建(新)一个新的数据对
但我在执行时遇到了以下错误:
函数Append中的“对象引用未设置为对象的实例”
发生了什么事?您尚未初始化数据对。 _数据对=新数据对[大小]
总之,Append中的代码是错误的。不能以这种方式增加数组的大小。最好使用
列表
而不是数组。您还没有初始化数据对。
_数据对=新数据对[大小]
总之,Append中的代码是错误的。不能以这种方式增加数组的大小。使用
列表
而不是数组可能更好。您的代码创建一个新的数据对
,但从不初始化数据对
数组。因此,数据对引用null,任何尝试取消引用它的行为都将导致NullReferenceException
。您需要在访问它之前对其进行初始化:
_datapair = new DataPair[someSize];
不过,我认为您最好使用一个列表,因为数组不会自动调整大小:
private readonly IList<DataPair> datapairs;
...
datapairs = new List<DataPair>();
...
datapairs.Add(new DataPair(...));
专用只读IList数据对;
...
数据对=新列表();
...
添加(新数据对(…);
您的代码创建一个新的数据对
,但从不初始化数据对
数组。因此,数据对引用null,任何尝试取消引用它的行为都将导致NullReferenceException
。您需要在访问它之前对其进行初始化:
_datapair = new DataPair[someSize];
不过,我认为您最好使用一个列表,因为数组不会自动调整大小:
private readonly IList<DataPair> datapairs;
...
datapairs = new List<DataPair>();
...
datapairs.Add(new DataPair(...));
专用只读IList数据对;
...
数据对=新列表();
...
添加(新数据对(…);
我会像这样使用列表
:
public void Append(DataPair pair)
{
_datapair[_size] = new DataPair(pair);
_size++;
}
private readonly List<DataPair> _datapair = new List<DataPair>();
我会像这样使用List
:
public void Append(DataPair pair)
{
_datapair[_size] = new DataPair(pair);
_size++;
}
private readonly List<DataPair> _datapair = new List<DataPair>();
这是因为您的_数据对数组未实例化:
private DataPair [] _datapair = new DataPair[] { };
这是因为您的_数据对数组未实例化:
private DataPair [] _datapair = new DataPair[] { };
可能_数据对尚未初始化。您可以直接调用尚未初始化的_datapair[_size]。 顺便说一句,为什么不使用集合呢
private List<DataPair> _datapair = new List<DataPair>();
public void Append(DataPair pair)
{
_datapair.Add(pair);
}
private List_datapair=new List();
公共void追加(数据对)
{
_datapair.Add(pair);
}
_如果大小过时,则可以使用_datapair.Count()可能_datapair尚未初始化。您可以直接调用尚未初始化的_datapair[_size]。 顺便说一句,为什么不使用集合呢
private List<DataPair> _datapair = new List<DataPair>();
public void Append(DataPair pair)
{
_datapair.Add(pair);
}
private List_datapair=new List();
公共void追加(数据对)
{
_datapair.Add(pair);
}
_如果大小过时,则可以使用_datapair.Count()使用列表而不是数组,因为您在编译时不知道需要多少数据对。使用列表而不是数组,因为您在编译时不知道需要多少数据对。您不需要在
Append
中创建新的数据对,由于您已经在对Append
的调用中创建了数据对
对象,因此您只能执行以下操作:
public void Append(DataPair pair)
{
_datapair[_size] = pair;
_size++;
}
而且,\u size
是不必要的,因为所有的C#数组都会对其元素进行计数。您最好使用列表,或者如果您坚持使用数组,您可以这样做:
public void Append(DataPair pair)
{
_datapair[_datapair.Count()] = pair;
}
当Append
尝试将新对象添加到\u datapair
数组时,会抛出错误,该数组不是数组,而是对数据对数组的未初始化引用。因此,正如下面的答案所说,您必须初始化数组,但必须知道其最大大小或所需大小:
private DataPair [] _datapair = new DataPair[10];
因为我相信您不知道大小,所以应该使用列表而不是数组
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());
}
}
private List_datapair=new List();
公共void追加(数据对)
{
_datapair.Add(pair);
}
公共void FillFromFile(字符串文件路径)
{
尝试
{
if(System.IO.File.Exists(filepath))
{
System.IO.StreamReader sr=新的System.IO.StreamReader(文件路径);
字符串[]当前数据;
而(sr.Peek()>=0)
{
currentdata=sr.ReadLine().Replace(',',').Trim().Split(';');
this.Append(新数据对(currentdata[0],System.Convert.ToSingle(currentdata[1]));
}
高级关闭();
}
}
捕获(例外e)
{
WriteLine(“数据文件中的错误:{0}”,e.ToString());
}
}
如果您想知道列表的大小,请调用\u datapair.Count()
,如果您想访问列表中的第四个元素,\u datapair[4]=null
您不需要在Append
中创建新的数据对,因为您已经在对Append
的调用中创建了datapair
对象,因此,您只能这样做:
public void Append(DataPair pair)
{
_datapair[_size] = pair;
_size++;
}
而且,\u size
是不必要的,因为所有的C#数组都会对其元素进行计数。您最好使用列表,或者如果您坚持使用数组,您可以这样做:
public void Append(DataPair pair)
{
_datapair[_datapair.Count()] = pair;
}
当Append
尝试将新对象添加到\u datapair
数组时,会抛出错误,该数组不是数组,而是对数据对数组的未初始化引用。因此,正如下面的答案所说,您必须初始化数组,但必须知道其最大大小或所需大小:
private DataPair [] _datapair = new DataPair[10];
因为我相信您不知道大小,所以应该使用列表而不是数组
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());
}
}
private List_datapair=new List();
公共void追加(数据对)
{
_datapair.Add(pair);
}
公共void FillFromFile(字符串文件路径)
{
尝试
{
if(System.IO.File.Exists(filepath))
{