使用 foreach 循环和 NullReferenceException 打印对象

本文关键字:打印 对象 NullReferenceException foreach 循环 使用 | 更新日期: 2023-09-27 18:35:17

我已经开始学习C#,我一直在关注我在网上找到的一些"迷你项目",还有一些是我自己编造的,以帮助我理解基础知识。这个小项目要求我创建两个名为"项目"和"库存"的类。这个想法是,item 类用于创建项目,另一个库存类用于存储项目并打印它们。这是到目前为止的代码:

class Program
    {
        static void Main(string[] args)
        {
            inventory my_inventory = new inventory();
            item cake = new item("Cake", 2.99, 001);
            item carrot = new item("Carrot", 0.59, 002);
            my_inventory.add_item(cake);
            my_inventory.add_item(carrot);
            my_inventory.print_inv();
            Console.ReadLine();
        }
    }

    class item 
    {
        string name;
        double price;
        int id;
        public item (string Name, double Price, int ID) 
        {
            this.name = Name;
            this.price = Price;
            this.id = ID;
        }
        public item() 
        {
            this.name = "unknown";
            this.price = 0.00;
            this.id = 000;
        }
        public override string ToString()
        {
            return "Name: " + name + " Price: " + price + " ID Number: " + id;
        }
    }
    class inventory 
    {
        object[] inv_list = new object[10];
        int tracker = 0;
        public void add_item(object obj) 
        {
            inv_list[tracker] = obj;
            tracker++;
        }
        public void print_inv() 
        {
            foreach ( object obj in inv_list) { Console.WriteLine(obj.ToString()); }
        }
    }

我一直遇到的错误是print_inv()方法中的"NullReferenceException",从我所读到的内容来看,这意味着我尝试在 print_inv() 方法上使用的对象是空的?我不确定这在我的代码中意味着什么。

使用 foreach 循环和 NullReferenceException 打印对象

这里的问题是,当你创建一个东西的数组时,它会用某物的默认值进行初始化。如果是object,默认值为 null

因此,您需要修改print_inv方法来查看现有项目:

public void print_inv() 
{
   for(int i =0; i < tracker; i++)
   {
      Console.WriteLine(inv_list[i].ToString());
   }
}

问题是,由于您声明了一个特定大小(new object[10])的数组,因此数组始终是该大小。因此,当你迭代它(foreach(object obj in inv_list)时,你将得到一切,而不仅仅是你显式初始化的值。由于objectdefaultnull,因此数组中除了那些显式项目之外的所有项目都是空的。

有几种方法可以解决此问题:

  • foreach替换为for(int i = 0; i < tracker; i++) - 这只会遍历项目直至跟踪器计数,仅此而已。
  • 使用List<object>而不是数组。这将允许您添加/删除项目,而不必明确担心容量,因此应避免大多数自动初始化的值。但是,可能需要更多代码才能将库存保持在 10 个项目以下。
  • 检查空值和continuebreak当您在物品栏中遇到空物品时。