2014-02-28 89 views
1

我絕對是新的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

調試器怎麼樣?你有沒有試圖調試異常 – Jehof

+0

可能重複[什麼是NullReferenceException,我該如何解決它?](http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do -i-fix-it) – Jehof

+0

順便說一下,爲什麼這個屬性是'virtual'? – Jon

回答

2

您還沒有初始化VulnerabilityReferences名單。因此它具有null值,並且當您嘗試調用其Add方法時它會拋出異常。您可以在Vuln類的構造函數創建新的列表:

public class Vuln : VulnSmall 
{ 
    public Vuln() 
    { 
     VulnerabilityReferences = new List<VulnerabilityReference>(); 
    } 

    // ... 
} 

從C#規範10.4.4 Field initialization(你仍然有場自動實現的屬性,但它由編譯器爲您生成):

初始字段的值(無論是靜態字段還是實例字段)是字段 類型的默認值(第5.2節)。

列表是一個引用類型,所以默認情況下它的值將爲null

+1

太過於清晰的解釋 – AndreaNobili

2

你應該初始化VulnerabilityReferences,它會更好,如果你在你的構造做:

public class Vuln : VulnSmall 
{ 
    public Vuln() 
    { 
     VulnerabilityReferences = new List<VulnerabilityReference>(); 
    } 
} 
2

Vuln類的構造函數,你需要這樣做:

public Vuln() 
{ 
    VulnerabilityReferences = new List<VulnerabilityReference>(); 
} 
2

您正在嘗試添加一些尚不存在的列表。

定義您的列表屬性是不夠的,您還必須初始化它。例如:

public class Vuln : VulnSmall 
{ 
    public virtual List<VulnerabilityReference> VulnerabilityReferences { get; set; } 

    public Vuln() 
    { 
     this.VulnerabilityReferences = new List<VulnerabilityReference>(); 
    } 
} 
2

由於對列表的引用爲空,您將得到空引用異常。你只需要一個列表的引用,你必須在某個時候創建​​實際的列表:

VulnerabilityReferences = new List<VulnerabilityReference>(); 

你可以做,例如在類的構造函數:

public class Vuln : VulnSmall { 

    public virtual List<VulnerabilityReference> VulnerabilityReferences { get; set; }  

    public Vuln(){ 
    VulnerabilityReferences = new List<VulnerabilityReference>(); 
    } 

} 
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; 
     } 
    } 
    } 
相關問題