为什么我无法将此对象添加到此列表中?

时间:2014-02-28 11:56:27

标签: c#

我绝对是 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}

为什么呢?可能是什么问题呢?我错过了什么?

6 个答案:

答案 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; 
      }
    }
  }