2017-01-20 42 views
0

我创造我自己的类结构:Array from Array;系统空引用异常

namespace testproject 
{ 
    public class frameSructure 
    { 
     public string type = "n/a"; 
     public string reader = "n/a"; 
    } 
} 

当我使用它的形式作为一个单一的建设,一切都很好,但是当我创建一个数组,当我尝试使用它:

namespace testproject 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 
     public frameSructure[] frame = new frameSructure[10]; 
     private void Form1_Load(object sender, EventArgs e) 
     { 
      frame[1].type = "n/a"; 
     } 
    } 
} 

我得到一个系统空引用异常。 {“对象引用未设置为对象的实例。”}

frame[1].type = "n/a"; 

有人可以帮我理解为什么吗? 谢谢

+1

当创建引用类型的阵列(如你的'frameStructure')的数组充满空值;它没有填充该类的默认构造实例。你将不得不循环填充实际的实例。 –

+0

这是因为'new frameStruct'只在堆栈/堆上分配内存,但不创建* struct的任何实例。事先需要'frame [1] = new frameStruct()'。 – HimBromBeere

+0

另请参阅http://stackoverflow.com/questions/18849325/c-null-reference-exception –

回答

0

你初始化数组,而不是它里面的值。 这意味着虽然数组有10个条目,但它们全都为空。

更改表单负载这样:

private void Form1_Load(object sender, EventArgs e) 
    { 
     frame[1] = new frameSructure(); 
     frame[1].type = "n/a"; 
    } 

顺便说一句,在c#阵列从0开始,而不是1

+0

谢谢你的更正。我不明白为什么我需要一个一个地创建数组的所有元素,如果我已经声明了由类组成的数组,但我知道如何使用它。谢谢。 – Rivendare

0

您需要先将一个项目添加到数组中。在你的代码中,你只创建了一个帧结构类型的空数组。

您将项目添加到您的阵列,像这样......

frame[1]= new frameSructure(); 
+0

感谢您的更正。我不明白为什么我需要一个一个地创建数组的所有元素,如果我已经声明了由类组成的数组,但我知道如何使用它。谢谢。 – Rivendare

+0

您已创建数据结构(数组),但尚未放入任何数据。将数组看作公交车和其中的人员作为数据。目前你有一辆空车。 –