"对象引用未设置为对象的实例"尝试将对象添加到类中的列表时出错

时间:2014-05-01 20:55:55

标签: c# list class object nullreferenceexception

我定义了一些自定义类,包括其他类的列表,如:

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;查看调试器中的本地人,我可以看到UnitGroupType都已成功创建,group1包含所有Type值& #39; s应该,但unit1.Contains为空。

我做错了什么?仅供参考我之前从未做过这样的事情,所以我甚至不知道它是否可行,但在此之前似乎工作正常。

3 个答案:

答案 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将自动初始化。