提问人:thanby 提问时间:5/2/2014 最后编辑:John Saundersthanby 更新时间:11/21/2017 访问量:24153
尝试将对象添加到类中的列表时出现“对象引用未设置为对象的实例”错误 [重复]
"Object reference not set to an instance of an object" error when trying to add objects to a list inside a class [duplicate]
问:
我定义了一些自定义类,其中包括其他类的列表,如下所示:
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);
但是在这里我收到错误(在方法上)“对象引用未设置为对象的实例”。查看调试器中的局部变量,我可以看到 和 都已成功创建,并且包含它应该包含的所有值,但为 null。Add
Unit
Group
Type
group1
Type
unit1.Contains
我做错了什么?仅供参考,我以前从未做过这样的事情,所以我什至不知道这是否可能,但到目前为止它似乎工作正常。
答:
类中的列表永远不会被实例化。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
评论
public List<Group> Contains {get; private set;}
你永远不会被初始化,所以当你尝试访问它时,你会得到一个空引用异常。基本上所有 null 引用异常都是相同的,您正在尝试使用为 null 的对象。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>();
}
}
评论
Contains
您已初始化 Unit,但 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 类构造函数中,您可以初始化 在此处列出代码
public class Unit
{
public string Name { get; set; }
public List<Group> Contains { get; set; }
public Unit()
{
Contains = new List<Group>();
}
}
我更喜欢第二种解决方案,因为它将确保每当初始化 Unit 时,Contains 都会自动初始化。
评论
NullReferenceException
Contains
Contains