У вас есть объекты ссылки. Это означает, что до тех пор, пока вы ссылаетесь на тот же объект (экземпляр), по умолчанию все работает так, как вы ожидали.
Пример (используя классы):
User u = new User();
Project p = new Project();
p.Manager = u;
u.Projects.Add(p);
Это создает пустой пользователя и пустой проект. Проект ссылается на пользователя, список проектов пользователя ссылается на проект.
Теперь вы измените имя пользователя и проект:
u.FirstName = "Test";
u.LastName = "User";
Это позволит вам получить следующий результат:
Console.WriteLine("{0} {1}", p.Manager.FirstName, p.Manager.LastName);
=> Test User
Другая вещь, которую вы можете сделать сейчас, заключается в следующем:
User userInfo = p.Manager;
userInfo.EMailAddress = "[email protected]";
Это будет отражать любой способ доступа к объекту пользователя, который вы назначили, поскольку все эти «переменные» «указывая» на один и тот же экземпляр объекта (они ссылаются на один и тот же объект в памяти).
Вы можете даже передать свой объектную ссылку на другой метод:
public void ChangeProjectManagerEmail(Project theProject, string newEMail)
{
theProject.Manager.EMailAddress = newEMail;
}
Вызов выше метод, как это:
ChangeProjectManagerEmail(p, "[email protected]");
приведет к следующим образом:
Console.WriteLine(u.EMailAddress);
=> [email protected]
Что не работает:
User anotherUser = new User();
anotherUser.UserId = 5;
Console.WriteLine(p.Manager.UserId);
Этот выход будет 0
, как новый пользователь anotherUser
не ссылается на какой-либо другой объект.
Вам нужно быть осторожным, когда дело доходит до сохранения такой структуры. Хотя хранить его (в файле, базе данных и т. Д.) Довольно просто, вам нужно убедиться, что вы заново создаете ту же самую структуру объекта, когда читает данных. Представьте себе:
- Проект 1 ссылки u1 Пользователь
- Project 2 ссылки u1 Пользователь
- ссылки u1 проекта 1 и 2
Теперь в первую очередь вы должны решить, хотите ли вы упорствовать на пользователя или на проект, иначе вы можете выполнять дублируемую работу. Когда восстанавливает сохраненную информацию, вам необходимо убедиться, что вы создали только один пользователь! (лучше всего использовать уникальный идентификатор, чтобы проверить, был ли пользователь уже восстановлен). В противном случае вы получите два разных объекта User
с той же информацией, и вам будет интересно, почему изменение пользователя отражает только один проект. Наихудший случай заключается в том, что после изменения пользовательской информации у вас будет два пользователя с одинаковым идентификатором, но с другой информацией в вашем хранилище.
Все, что сказал: WATCH OUT! Структура вашего объекта несколько опасна с точки зрения перекрестных ссылок. Как и сейчас, очень удобно добавлять проект к пользователю, который ссылается на совершенно другого пользователя в качестве своего менеджера. Пример:
User user1 = new User();
// Initialize ID, name, etc.
User user2 = new User();
// Initialize ID, name, etc.
Project p = new Project();
// Initialize stuff
p.Manager = user2;
user1.Projects.Add(p);
См. Неполадку здесь?
Ключевое слово звучит как «магазин». Что вы имеете в виду? 'Project' и' User' являются ссылочными типами, поэтому экземпляры 'Project' в' Projects' и 'User', на которые ссылается' Manager', уже являются ссылками. –
Вы пробовали, чтобы узнать, что произойдет? Я думаю, вы заметите, что он уже делает именно то, что вы хотите. –
Это уже произойдет. –