我绝对是 C#中的新手,我在尝试将对象插入集合时遇到以下问题。
所以我有一个名为 VulnSmall 的基类,其中包含一些属性,然后我有一个名为 Vuln 的类扩展以前的 VulnSmall 类向其添加一些属性,包括名为VulnerabilityReferences的列表,如以下代码段所示:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DataModel.Vulnerability
{
public class Vuln : VulnSmall
{
.......................
.......................
.......................
public virtual List<VulnerabilityReference> VulnerabilityReferences { get; set; }
.......................
.......................
.......................
}
}
确定,
在另一个班级我有类似的东西:
DataModel.Vulnerability.Vuln currentNVDVuln = new DataModel.Vulnerability.Vuln();
// Creation of the VulnerabilityReference object and initialization of its fields:
DataModel.Vulnerability.VulnerabilityReference currentVulnRef = new DataModel.Vulnerability.VulnerabilityReference();
currentVulnRef.Title = "My Title";
currentVulnRef.Description = "My Descripion"
currentVulnRef.URL = "www.myurl.com"
// Adding the previous obkect to the VulnerabilityReferences list field:
currentNVDVuln.VulnerabilityReferences.Add(currentVulnRef);
正如您所看到的,我有一个名为currentNVDVuln的 Vuln 对象(其中包含 VulnerabilityReferences 列表作为其字段),我创建了 VulnerabilityReference 对象(名为 currentVulnRef ),我尝试将其添加到此列表中。
但是不要工作,当试图执行这一行时:
currentNVDVuln.VulnerabilityReferences.Add(currentVulnRef);
它会出错并抛出异常:
{“对象引用未设置为对象的实例。”} System.Exception {System.NullReferenceException}
为什么呢?可能是什么问题呢?我错过了什么?
答案 0 :(得分:2)
您应该初始化VulnerabilityReferences
,如果您在构造函数中执行此操作会更好:
public class Vuln : VulnSmall
{
public Vuln()
{
VulnerabilityReferences = new List<VulnerabilityReference>();
}
}
答案 1 :(得分:2)
您尚未初始化VulnerabilityReferences
列表。因此它具有null
值,并且当您尝试调用其Add
方法时会抛出异常。您可以在Vuln
类的构造函数中创建新列表:
public class Vuln : VulnSmall
{
public Vuln()
{
VulnerabilityReferences = new List<VulnerabilityReference>();
}
// ...
}
来自C#规范10.4.4 Field initialization(使用自动实现的属性,你仍然有字段,但它是由编译器为你生成的):
字段的初始值,无论是静态字段还是静态字段 实例字段,是字段的默认值(第5.2节) 类型。
List是一种引用类型,因此默认情况下它的值为null
。
答案 2 :(得分:2)
在Vuln
类的构造函数中,您需要执行此操作:
public Vuln()
{
VulnerabilityReferences = new List<VulnerabilityReference>();
}
答案 3 :(得分:2)
您正尝试将某些内容添加到尚不存在的列表中。
仅定义列表属性是不够的,还必须初始化它。例如:
public class Vuln : VulnSmall
{
public virtual List<VulnerabilityReference> VulnerabilityReferences { get; set; }
public Vuln()
{
this.VulnerabilityReferences = new List<VulnerabilityReference>();
}
}
答案 4 :(得分:2)
您将获得空引用异常,因为对列表的引用为null。您只有列表的引用,您必须在某个时刻创建实际列表:
VulnerabilityReferences = new List<VulnerabilityReference>();
例如,您可以在类的构造函数中执行此操作:
public class Vuln : VulnSmall {
public virtual List<VulnerabilityReference> VulnerabilityReferences { get; set; }
public Vuln(){
VulnerabilityReferences = new List<VulnerabilityReference>();
}
}
答案 5 :(得分:1)
您应创建 List<VulnerabilityReference>
以将项目插入:
...
currentNVDVuln.VulnerabilityReferences = new List<VulnerabilityReference> VulnerabilityReferences();
currentNVDVuln.VulnerabilityReferences.Add(currentVulnRef);
但更好的解决方案是重新设计 VulnSmall
public class Vuln : VulnSmall {
// List is created on Vuln creation
private List<VulnerabilityReference> m_VulnerabilityReferences =
new List<VulnerabilityReference>();
// You're not going to set a whole list, are you?
// That's why no "set" here
public IList<VulnerabilityReference> VulnerabilityReferences {
get {
return m_VulnerabilityReferences;
}
}
}