Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在初始化时,它会说;对象引用未设置为对象的实例;_C# - Fatal编程技术网

C# 在初始化时,它会说;对象引用未设置为对象的实例;

C# 在初始化时,它会说;对象引用未设置为对象的实例;,c#,C#,我对C#完全是新手,我有一个错误,我猜不出它为什么会发生。这就是背景: 我有一个DataPair类,就是一对数据(string,float)。我还有另一个类DataSet,它是一个数据对数组 数据集有两个私有成员: private DataPair [] _datapair; private int _size; DataSet的构造函数不处理_数据对,并将_大小设置为0 我用一个方法Append填充数据集,其作用如下: public void Append(DataPair pair) {

我对C#完全是新手,我有一个错误,我猜不出它为什么会发生。这就是背景:

我有一个DataPair类,就是一对数据(string,float)。我还有另一个类DataSet,它是一个数据对数组

数据集有两个私有成员:

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))
{