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

本文关键字:对象 quot 列表 出错 添加 实例 对象引用 设置 | 更新日期: 2023-09-27 18:01:07

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

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方法上("Object reference not set to a instance of a Object"。查看调试器中的本地程序,我可以看到UnitGroupType都成功创建了,group1包含了它应该包含的所有Type值,但unit1.Contains为空。

我做错了什么?仅供参考,我以前从未做过这样的事情,所以我甚至不知道这是否可能,但在这之前,它似乎一直很好。

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

您的List<Group> Contains从未初始化,因此当您尝试访问它时,会得到一个null引用异常。本质上,所有的null引用异常都是相同的,您试图使用一个null对象。

在这种情况下,让我们只添加一个默认的构造函数来为我们初始化列表

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>();
    }
}

User类中的Contains列表永远不会实例化。

您可能想将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

您已经初始化了单元,但单元。包含不初始化。在将对象添加到"包含"列表之前,必须对其进行初始化。

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);

在你的单元类构造函数中,你可以初始化这里列出代码

public class Unit
{
public string Name { get; set; }
public List<Group> Contains { get; set; }
public Unit()
{
Contains = new List<Group>();
}
}

我更喜欢第二个解决方案,因为它将确保无论何时初始化单元,Contains都将自动初始化。

相关文章: