2014-05-01 126 views
0

我有包括其他類的列表,像這樣定義了一些自定義類:「對象引用不設置到對象的實例」錯誤

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方法)「不設置到對象的實例對象引用。」在調試器中查看當地人,我可以看到Unit,GroupType都已成功創建,並且group1包含所有應該設置的Type值,但unit1.Contains爲空。

我在做什麼錯?僅供參考我從來沒有做過這樣的事情,所以我甚至不知道是否有可能,但似乎在此之前工作得很好。

+1

幾乎所有的'NullReferenceException'都是一樣的。請參閱「[什麼是.NET中的NullReferenceException?](http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-in-net)」的一些提示。 –

+0

如果你不想改變你的班級,只需更新列表。 unit1.Contains =新列表(); – asunrey

+0

我會建議不要寫一個可寫的'Contains'屬性。作爲只讀屬性公開的列表仍然可以從類外部修改(因爲可以在其中添加和刪除東西),這將阻止外部代碼將實例設置爲null或另一個列表。哦,不要將它命名爲「Contains」。 – Crono

回答

10

您的List<Group> Contains永遠不會被初始化,所以當您嘗試訪問它時,會得到一個空引用異常。基本上所有的空引用異常都是相同的,你試圖使用一個空的對象。

在這種情況下,我們只需添加一個默認構造函數來爲我們初始化列表。

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

啊因爲某種原因'Contains'方法從來沒有出現過,謝謝指出! – thanby

+0

@thanby雖然我建議不要讓你的列表屬性可寫。這不太可能。 – Crono

+0

@Crono相反,我一直讓它們可寫。這隻取決於情況以及目標是如何使用的。 – mason

4

您的Contains列表中的User類永遠不會被實例化。

您可能需要您的User類更改爲這個:

public class Unit 
{ 
    public string Name { get; set; } 

    List<Group> list = new List<Group>(); 

    public List<Group> Contains 
    { 
     get { return list; } 
    } 
} 

正如你可以看到Contains屬性現在只返回當然可以修改,但從來沒有reaffected列表實例。可能,這是你想要的。

雖然這是您的問題範圍之外的一點點,但我建議您將Contains屬性重命名爲Groups

+0

無法找到類型或名稱空間名稱'var' - 請原諒我的n00bishness,但是我錯過了什麼讓我可以使用它?它在一種方法中工作正常,但不在課堂上。 – thanby

+0

@thanby我編輯了我的答案,看看它是否有幫助。 – Crono

+0

通過在屬性上使用私有集合運算符,您可以完成同樣的事情,而不需要專用字段。簡化代碼。 '公開名單包含{get;私人設置;}' – mason

1

您初始化了單位,但Unit.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); 

或者

在你單位類的構造函數可以初始化這裏列出代碼

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

我寧願第二個解決方案,因爲這將確保無論何時單元初始化包含將自動初始化。

相關問題