我定义了一些自定义类,包括其他类的列表,如:
public class Unit
{
public string Name { get; set; }
public List<Group> Contains { get; set; }
}
public class Group
{
public string Name { get; set; }
public Type Type { get; set; }
public int Number { get; set; }
}
public static Type basic_1 = new Type() { Name = "basic_1", Number = 1, Cost = 13 };
基本思想是你有一个包含一个组列表的单元,每个组都有不同的类型。该类型包含特定属性,而包含它们的类本质上是组织性的。
然后我尝试开始构建这些类:Unit unit1 = new Unit() { Name = "Unit 1" };
Group group1 = new Group() { Name = "Group 1", Number = 10, Type = basic_1 };
unit1.Contains.Add(group1);
但是在这里我收到错误(在Add
方法上)&#34;对象引用未设置为对象的实例。&#34;查看调试器中的本地人,我可以看到Unit
,Group
和Type
都已成功创建,group1
包含所有Type
值& #39; s应该,但unit1.Contains
为空。
我做错了什么?仅供参考我之前从未做过这样的事情,所以我甚至不知道它是否可行,但在此之前似乎工作正常。
答案 0 :(得分:12)
您的List<Group> Contains
永远不会被初始化,因此当您尝试访问它时,您会得到一个空引用异常。基本上所有空引用异常都是相同的,你试图使用一个空的对象。
在这种情况下,让我们添加一个默认构造函数来为我们初始化列表。
public class Unit
{
public string Name { get; set; }
public List<Group> Contains { get; set; }
public Unit()
{
Contains = new List<Group>();
}
}
顺便说一句,Contains
是列表的可怕名称。 Contains
通常是一个函数调用,因为它是一个动词。通常最好使用名词作为集合,例如Groups
。
public class Unit
{
public string Name { get; set; }
public List<Group> Groups { get; set; }
public Unit()
{
Groups = new List<Group>();
}
}
答案 1 :(得分:4)
Contains
类中的User
列表永远不会被实例化。
您可能希望将User
课程更改为:
public class Unit
{
public string Name { get; set; }
List<Group> list = new List<Group>();
public List<Group> Contains
{
get { return list; }
}
}
正如您所看到的,Contains
属性现在只返回一个列表实例,该列表实例当然可以被修改但从未重新受到影响。可能,这就是你想要的。
虽然这有点超出了您的问题的范围,但我建议您将Contains
属性重命名为Groups
。
答案 2 :(得分:1)
您已初始化单位但 Unit.Contains 未初始化。在将对象添加到包含列表之前,必须初始化它。
Unit unit1 = new Unit() { Name = "Unit 1" };
Group group1 = new Group() { Name = "Group 1", Number = 10, Type = basic_1 };
unit1.Contains = new List<Group>();
unit1.Contains.Add(group1);
或强>
在你的Unit类构造函数中,你可以在这里初始化List代码
public class Unit
{
public string Name { get; set; }
public List<Group> Contains { get; set; }
public Unit()
{
Contains = new List<Group>();
}
}
我更喜欢第二种解决方案,因为它会确保每当Unit初始化时,Contains将自动初始化。