C# &引用;对象引用未设置为对象的实例;尝试将对象添加到类内的列表时出错
我定义了一些自定义类,其中包括其他类的列表,如:C# &引用;对象引用未设置为对象的实例;尝试将对象添加到类内的列表时出错,c#,list,class,object,nullreferenceexception,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 Numbe
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
方法上)“对象引用未设置为对象的实例”。查看调试器中的局部变量,我可以看到单元
,组
和类型
都已成功创建,组1
包含它应该包含的所有类型
值,但unit1.contains
为空
我做错了什么?仅供参考,我以前从未做过类似的事情,所以我甚至不知道这是否可能,但在这之前它似乎工作得很好。您的
包含用户类中的列表从未被实例化
您可能希望将用户
类改为:
public class Unit
{
public string Name { get; set; }
List<Group> list = new List<Group>();
public List<Group> Contains
{
get { return list; }
}
}
公共类单元
{
公共字符串名称{get;set;}
列表=新列表();
公共列表包含
{
获取{返回列表;}
}
}
正如您所看到的那样,Contains
属性现在只返回一个列表实例,当然可以修改,但永远不会重新生效。很可能,这就是你想要的
虽然这有点超出了您的问题范围,但我建议您将Contains
属性重命名为Groups
。您的Contains
列表在User
类中永远不会被实例化
您可能希望将用户
类改为:
public class Unit
{
public string Name { get; set; }
List<Group> list = new List<Group>();
public List<Group> Contains
{
get { return list; }
}
}
公共类单元
{
公共字符串名称{get;set;}
列表=新列表();
公共列表包含
{
获取{返回列表;}
}
}
正如您所看到的那样,Contains
属性现在只返回一个列表实例,当然可以修改,但永远不会重新生效。很可能,这就是你想要的
虽然这有点超出了您的问题范围,但我建议您将Contains
属性重命名为Groups
。您的列表Contains
从未初始化过,因此当您尝试访问它时,会出现空引用异常。实际上,所有空引用异常都是相同的,您尝试使用的对象是空的
在本例中,我们只需添加一个默认构造函数来初始化列表
public class Unit
{
public string Name { get; set; }
public List<Group> Contains { get; set; }
public Unit()
{
Contains = new List<Group>();
}
}
您的列表包含的
永远不会初始化,因此当您尝试访问它时,会出现空引用异常。实际上,所有空引用异常都是相同的,您尝试使用的对象是空的
在本例中,我们只需添加一个默认构造函数来初始化列表
public class Unit
{
public string Name { get; set; }
public List<Group> Contains { get; set; }
public Unit()
{
Contains = new List<Group>();
}
}
您已经初始化了该单元,但单元。包含未初始化。在将对象添加到包含列表之前,必须对其进行初始化
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);
unitunit1=newunit(){Name=“unit1”};
groupgroup1=newgroup(){Name=“group1”,Number=10,Type=basic_1};
unit1.Contains=新列表();
unit1.Contains.Add(组1);
或
在单元类构造函数中,您可以在此处初始化代码列表
public class Unit
{
public string Name { get; set; }
public List<Group> Contains { get; set; }
public Unit()
{
Contains = new List<Group>();
}
}
公共类单元
{
公共字符串名称{get;set;}
公共列表包含{get;set;}
公共单位()
{
包含=新列表();
}
}
我更喜欢第二种解决方案,因为它将确保无论何时初始化单元,Contains都将自动初始化。您已初始化单元,但单元。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);
unitunit1=newunit(){Name=“unit1”};
groupgroup1=newgroup(){Name=“group1”,Number=10,Type=basic_1};
unit1.Contains=新列表();
unit1.Contains.Add(组1);
或
在单元类构造函数中,您可以在此处初始化代码列表
public class Unit
{
public string Name { get; set; }
public List<Group> Contains { get; set; }
public Unit()
{
Contains = new List<Group>();
}
}
公共类单元
{
公共字符串名称{get;set;}
公共列表包含{get;set;}
公共单位()
{
包含=新列表();
}
}
我更喜欢第二种解决方案,因为它将确保无论何时初始化单元,都会自动初始化。几乎所有NullReferenceException
的情况都是相同的。请参阅“”以获得一些提示。如果不想更改您的类,只需重新设置列表即可。unit1.Contains=新列表();我建议不要创建可写的Contains
属性。作为只读属性公开的列表仍然可以从类外部修改(例如,可以添加和删除其中的内容),这将防止外部代码将实例设置为null或其他列表。哦,也不要把它命名为包含。几乎所有NullReferenceException
的情况都是一样的。请参阅“”以获得一些提示。如果不想更改您的类,只需重新设置列表即可。unit1.Contains=新列表();我建议不要创建可写的Contains
属性。作为只读属性公开的列表仍然可以从类外部修改(例如,可以添加和删除其中的内容),这将防止外部代码将实例设置为null或其他列表。哦,也不要将其命名为Contains
Contains。找不到类型或名称空间名称“var”-请原谅我的n00bishness,但我缺少什么来允许我使用它?它在方法中运行良好,但在类中不起作用。@thanby我编辑了我的答案,看看是否有帮助。通过在属性上使用私有集运算符,您可以在不需要私有字段的情况下完成同样的任务。简化了代码<代码>公共列表包含{get;private set;}
@mason,但是您需要一个构造函数来实例化列表。:)找不到类型或命名空间名称“var”-请原谅我的n00bishness,但我缺少什么来允许我使用它?它在方法中运行良好,但在类中不起作用。@thanby我编辑了我的答案,看看是否有帮助。你也可以完成同样的任务