Как добавить объект в список (или другую коллекцию), который находится внутри другого объекта? - PullRequest
0 голосов
/ 22 апреля 2011

У меня есть это:

    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 ]

3 голосов
/ 22 апреля 2011

Вы не создали список - поэтому roomi.UsersInRoom имеет значение null.

Вы можете исправить это, изменив строку на:

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

Обратите внимание, что если вы используетеC # 3 или выше, вы можете использовать инициализаторы объектов и коллекций, чтобы упростить весь этот код.Кроме того, вы могли бы потенциально сделать UsersInRoom свойством только для чтения, установив значение для нового списка в конструкторе Room (или инициализаторе переменной).

К сожалению, у меня нет времени показыватьвсе это прямо сейчас, но что-то вроде этого для инициализаторов объекта / коллекции:

_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
        }
    }
});
1 голос
/ 22 апреля 2011

Вы убедились, что List инициализирован? Список - это объект, поэтому вы должны его «создать», вот так:

List<User> nameOfList = new List<User>();
1 голос
/ 22 апреля 2011

List<T>, является ссылочным типом. Значением по умолчанию для ссылочного типа является null.

Вам нужно инициализировать Список, прежде чем начинать добавлять в него элементы.

roomi.UsersInRoom=new List<User>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...