范围/可访问性&你调用的对象是空的

时间:2017-01-28 16:29:10

标签: c# .net nullreferenceexception

道歉可能是一个愚蠢的问题,但我想我已经把我的代码归结为核心问题,其中有两个让我疯狂。我很感激你的帮助。

在下面的代码中,第一个问题是当我的调试到达'bus [0]行时''我得到'对象引用未设置为对象的实例',即使我刚刚实例化了类在上一行。

我的下一个问题是'SystemArrays'类是一个存储库,我的所有类(例如'Solver')都可以看到它们,它们可以在这里获得& amp;设置其公共属性。但是,我无法确定如何或在何处实例化该类以使其对所有人可见。

非常感谢任何帮助。谢谢。

    public Form1()
    {
        InitializeComponent();
    }

    SystemArrays newArray = new SystemArrays();

    private void button1_Click(object sender, EventArgs e)
    {
        Bus[] bus = new Bus[3];
        bus[0].elementNum = 5;
        bus[1].elementNum = 8;
        bus[2].elementNum = 26;

        newArray.buses[0].elementNum = bus[0].elementNum;
    }

    public class SystemArrays
    {
        public Bus[] buses { get; set; }
    }

    public class Bus
    {
        public int elementNum { get; set; }
    }

    public class Solver
    {
        // int x = newArray.buses[0].elementNum;
    }

3 个答案:

答案 0 :(得分:2)

1。您正在初始化数组,而不是初始化数组中的对象,因此对象引用未设置为对象的实例异常。因此,您需要进行类似

的代码更改
Bus[] bus = new Bus[3];
bus[0].elementNum = 5;

Bus[] bus = new Bus[3];
bus[0] = new Bus();
bus[0].elementNum = 5;

2。要使newArray公开,请通过指定正确的保护级别(如public)来设置正确的辅助功能,因为您需要将该类公开给其他类。此外,如果需要newArray的单个副本,则可以将其声明为静态,但如果为此类场景创建get属性则更好。

public static SystemArrays newArray = new SystemArrays();

答案 1 :(得分:1)

您将'对象引用未设置为对象的实例'异常,因为这正是发生的事情。您已创建了5个元素(总线)的数组,但尚未初始化它们。创建数组后,其所有项目都包含数组类型的默认值。在您的情况下,数组类型为Bus(引用类型),所有引用类型的默认值为null

您可以通过简单地分配:

来初始化数组的值
bus[0] = new Bus();

答案 2 :(得分:1)

问题是你要实例化数组,而不是单个实例。 您可以使用以下紧凑方式:

var buses = new Bus[3]  // instantiate an array object of size 3
{ 
   new Bus() { elementNum = 5 }, // instantiate new Bus object
   new Bus() { element = 8 },    // and here 
   new Bus() { elementNum = 26 }  // and here
};