2011-04-22 46 views
0

我有這樣的:如何將對象添加到另一個對象內部的列表(或其他集合)?

public class Room 
{ 
    public string RoomID { get; set; } 
    public string RoomName { get; set; } 
    public List<User> UsersInRoom { get; set; } 

    //public IDuplexClient RoomCallbackChannel { get; set; } 
} 

正如你可以看到有一個包含用戶在房間的列表。

但實際上使它工作,我需要添加用戶,所以我這樣做:

  User usr; 
     Room roomi; 
     if (userNameTest == null) 
     { 
      lock (_clients) 
      { 
       usr = new User { UserID = sessionID, CallbackChannel = client, UserName = userName }; 
       roomi = new Room(); 
       roomi.RoomID = sessionID; 
       roomi.RoomName = room; 
       roomi.UsersInRoom.Add(usr); 
       //roomi.UsersInRoom.Add(usr); 
       _rooms.Add(roomi); 
       //_clients.Add(usr); 
      } 
     } 

,並在行:

roomi.UsersInRoom.Add(usr); 

我得到的NullReferenceException。 發生了什麼事?

回答

3

您還沒有創建清單 - 因此roomi.UsersInRoom爲空。

你可以改變這一行來解決這個:

roomi.UsersInRoom = new List<User>(); 
roomi.UsersInRoom.Add(usr); 

請注意,如果您正在使用C#3或更高版本,可以使用對象和集合初始化,使所有這些代碼更簡單。此外,您可能會使UsersInRoom爲只讀屬性,並將該值設置爲構造函數(或變量初始值設定項)內的新列表。

不幸的是我現在沒有時間來證明這一切的權利,但像這樣的對象/集合初始化:

_rooms.Add(new Room { 
    RoomId = sessionId, 
    RoomName = room, 
    UsersInRoom = new List<User> { 
     new User { 
      UserID = sessionID, 
      CallbackChannel = client, 
      UserName = userName 
     } 
    } 
}); 

如果你改變它,這樣UsersInRoom由房間本身初始化,此更改爲:

_rooms.Add(new Room { 
    RoomId = sessionId, 
    RoomName = room, 
    UsersInRoom = { 
     new User { 
      UserID = sessionID, 
      CallbackChannel = client, 
      UserName = userName 
     } 
    } 
}); 
+0

這很明顯。謝謝。 我已經爲usr使用了Object Initializer。但是我怎麼能爲房間做同樣的事情呢? – 2011-04-22 09:00:20

1

List<T>,是一個參考類型。引用類型的默認值是null

在開始添加項目之前,您需要初始化列表。

roomi.UsersInRoom=new List<User>(); 
1

您是否確定List已初始化?列表是一個對象,因此您必須「創建」它,如下所示:

List<User> nameOfList = new List<User>(); 
相關問題