我已经开始学习C#了,我一直在关注网上发现的一些“迷你项目”,有些我自己帮我理解基础知识。这个迷你项目要求我创建两个名为“item”和“inventory”的类。这个想法是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()方法上使用的对象是null?我不确定这在我的代码中意味着什么。
答案 0 :(得分:1)
这里的事情是,当你创建一个东西的数组时,它会用某个东西的默认值进行初始化。如果是object
,则默认值为null
。
因此,您需要修改print_inv
方法以查看现有项目:
public void print_inv()
{
for(int i =0; i < tracker; i++)
{
Console.WriteLine(inv_list[i].ToString());
}
}
答案 1 :(得分:0)
问题在于,因为您声明特定大小(new object[10]
)的数组,所以总是那个大小。因此,当您迭代它(foreach(object obj in inv_list
)时,您将获得所有内容,而不仅仅是您已明确初始化的值。由于default
的{{1}}为object
,因此除了数组中的所有显式项之外的所有项都为空。
有几种方法可以解决这个问题:
null
替换为foreach
- 这只会在项目之前迭代到跟踪器计数,而不再是。{/ li>
List<object>
代替数组。这将允许您添加/删除项目,而不必明确担心容量,因此应避免大多数自动初始化的值。但是,可能需要更多代码才能将库存保持在10个项目之下。for(int i = 0; i < tracker; i++)
或continue
。