C# 将对象存储为引用?

C# 将对象存储为引用?,c#,.net,C#,.net,我不完全确定我想要的是否可能,因为我想要的是: 我有几个不同的对象集合,我正在存储。比如说一组用户和一组项目 下面是一些它们可能看起来像什么的示例: public class User { public int UserId { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public string EmailAddress { get

我不完全确定我想要的是否可能,因为我想要的是:

我有几个不同的对象集合,我正在存储。比如说一组
用户
和一组
项目

下面是一些它们可能看起来像什么的示例:

public class User
{
    public int UserId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string EmailAddress { get; set; }

    public List<Project> Projects { get; set;} 
}

public class Project
{
    public int ProjectId { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }

    public User Manager { get; set; }
}
公共类用户
{
public int UserId{get;set;}
公共字符串名{get;set;}
公共字符串LastName{get;set;}
公共字符串电子邮件地址{get;set;}
公共列表项目{get;set;}
}
公共类项目
{
公共int ProjectId{get;set;}
公共字符串名称{get;set;}
公共字符串说明{get;set;}
公共用户管理器{get;set;}
}
如您所见,一个用户可以有多个项目,而一个项目有一个用户

基本上,当我存储这些信息时,我希望能够编辑用户集合中的用户,并自动更新该用户的任何项目,以包含该用户的更新信息。随后,如果我更新一个项目,任何使用该项目的用户都会自动更新他们的项目。像某种存储对象引用而不是值的方法


有什么方法可以做到这一点吗?

这里有对象引用。这意味着,只要您引用的是相同的对象(实例),默认情况下,一切都会按照您的预期工作

示例(使用您的类):

这将创建一个空用户和一个空项目。项目引用用户,用户的项目列表引用项目

现在更改用户和项目的名称:

u.FirstName = "Test";
u.LastName = "User";
这将允许您获得以下结果:

Console.WriteLine("{0} {1}", p.Manager.FirstName, p.Manager.LastName);
=> Test User
您现在可以做的另一件事是:

User userInfo = p.Manager;
userInfo.EMailAddress = "test@company.org";
这将反映您访问已分配的用户对象的任何方式,因为所有这些“变量”都“指向”同一对象实例(它们引用内存中的同一对象)

您甚至可以将对象引用传递给另一个方法:

public void ChangeProjectManagerEmail(Project theProject, string newEMail)
{
    theProject.Manager.EMailAddress = newEMail;
}
按如下方式调用上述方法:

ChangeProjectManagerEmail(p, "hello@world.com");
这将导致:

Console.WriteLine(u.EMailAddress);
=> hello@world.com
不起作用的是:

User anotherUser = new User();
anotherUser.UserId = 5;

Console.WriteLine(p.Manager.UserId);
这将输出
0
,因为新用户
其他用户
未被任何其他对象引用

在坚持这种结构时,你确实需要小心。虽然将其存储(在文件、数据库等中)非常简单,但您需要确保在读取数据时重新创建完全相同的对象结构。想象一下:

  • 项目1引用用户u1
  • 项目2引用用户u1
  • u1参考项目1和2
现在,首先需要决定是要按每个用户还是按每个项目持久化,否则可能会重复工作。恢复持久化信息时,需要确保只创建一个用户!(最好使用唯一ID检查用户是否已恢复)。否则,您将得到两个具有相同信息的截然不同的
User
对象,您将想知道为什么更改用户只反映一个项目。最坏的情况是,在更改用户信息后,您的存储中会出现两个ID相同但信息不同的用户


所有这些都表明:小心!您的对象结构在交叉引用方面有些危险。现在,很有可能将一个项目添加到一个引用完全不同的用户作为其经理的用户。例如:

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);

看到问题了吗?

这里有对象引用。这意味着,只要您引用的是相同的对象(实例),默认情况下,一切都会按照您的预期工作

示例(使用您的类):

这将创建一个空用户和一个空项目。项目引用用户,用户的项目列表引用项目

现在,您可以更改用户和项目的名称:

u.FirstName = "Test";
u.LastName = "User";
这将允许您获得以下结果:

Console.WriteLine("{0} {1}", p.Manager.FirstName, p.Manager.LastName);
=> Test User
您现在可以做的另一件事是:

User userInfo = p.Manager;
userInfo.EMailAddress = "test@company.org";
这将反映您访问已分配的用户对象的任何方式,因为所有这些“变量”都“指向”同一对象实例(它们引用内存中的同一对象)

您甚至可以将对象引用传递给另一个方法:

public void ChangeProjectManagerEmail(Project theProject, string newEMail)
{
    theProject.Manager.EMailAddress = newEMail;
}
按如下方式调用上述方法:

ChangeProjectManagerEmail(p, "hello@world.com");
这将导致:

Console.WriteLine(u.EMailAddress);
=> hello@world.com
不起作用的是:

User anotherUser = new User();
anotherUser.UserId = 5;

Console.WriteLine(p.Manager.UserId);
这将输出
0
,因为新用户
其他用户
未被任何其他对象引用

在坚持这种结构时,你确实需要小心。虽然将其存储(在文件、数据库等中)非常简单,但您需要确保在读取数据时重新创建完全相同的对象结构。想象一下:

  • 项目1引用用户u1
  • 项目2引用用户u1
  • u1参考项目1和2
现在,首先需要决定是要按每个用户还是按每个项目持久化,否则可能会重复工作。恢复持久化信息时,需要确保只创建一个用户!(最好使用唯一ID检查用户是否已恢复)。否则,您将得到两个具有相同信息的截然不同的
User
对象,您将想知道为什么更改用户只反映一个项目。最坏的情况是,在更改用户信息后,您的存储中会出现两个ID相同但信息不同的用户


所有这些都表明:小心!您的对象结构在交叉引用方面有些危险。现在,很有可能将一个项目添加到一个引用完全不同的用户作为其经理的用户。例如:

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);

看到这里的问题了吗?

您可以实现观察者设计模式来通知“o”