Scope/Accessibility & 对象引用未设置为对象的实例

Scope/Accessibility & Object Reference not set to an instance of an object

对于这可能是一个愚蠢的问题表示歉意,但我认为我已经将我的代码归结为核心问题,其中有两个让我抓狂。我将不胜感激任何帮助。

在下面的代码中,第一个问题是当我的调试到达行 'bus[0]..' 时,我得到了 'Object reference not set to an instance of an object',即使我只是在上一行中实例化了 class .

我的下一个问题是 'SystemArrays' class 旨在成为一个存储库,我的所有 classes(例如 'Solver')都可以看到它们可以获取和设置其 public 属性。但是,我不知道如何或在何处实例化 class 以使其对所有人可见。

如有任何帮助,我们将不胜感激。谢谢。

    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;
    }

您收到 'Object reference not set to an instance of an object' 异常,因为这正是正在发生的事情。您已经创建了包含 5 个元素(总线)的数组,但尚未对它们进行初始化。创建数组后,其所有项都包含数组类型的默认值。在您的情况下,数组类型为 Bus (引用类型),所有引用类型的默认值为 null

您可以通过简单地赋值来初始化数组的值:

bus[0] = new Bus();

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,请根据需要指定正确的保护级别(如 public)以设置正确的可访问性将 class 暴露给其他 classes。此外,如果您需要 newArray 的单个副本,您可以将其声明为静态的,但最好为这种情况创建一个 get 属性。

public static SystemArrays newArray = new SystemArrays();

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

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
};