Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何处理具有合成的对象_C# - Fatal编程技术网

C# 如何处理具有合成的对象

C# 如何处理具有合成的对象,c#,C#,我的名字是阿德森,在这一刻,我有一些关于组合引用到性能的问题。在这个模型中 我有一个简单的用户库和部门库。userbase具有deparmentbase类型的属性,departmentbase具有departmentbase类型的列表属性。 当我现在有一个userbase实例时,加载有关部门的信息,然后DepartmentBase也加载有关部门的信息 现在,当我为所有用户创建一个userbase列表,为所有用户再次加载进程时,这是一个很好的实践,或者更好的形式是什么 这取决于,如果您在加载用户列

我的名字是阿德森,在这一刻,我有一些关于组合引用到性能的问题。在这个模型中 我有一个简单的用户库部门库。userbase具有deparmentbase类型的属性,departmentbase具有departmentbase类型的列表属性。 当我现在有一个userbase实例时,加载有关部门的信息,然后DepartmentBase也加载有关部门的信息

现在,当我为所有用户创建一个userbase列表,为所有用户再次加载进程时,这是一个很好的实践,或者更好的形式是什么


这取决于,如果您在加载用户列表后直接需要所有部门数据,那么这是最好的方法。如果您不立即需要它,最好使用部门数据。这意味着您将推迟加载部门数据,直到调用显式方法(或属性)为止。

如果您在加载用户列表后直接需要所有部门数据,则这是最佳方法。如果您不立即需要它,最好使用部门数据。这意味着您将推迟加载部门数据,直到调用显式方法(或属性)为止。

我不知道这是否是一种更好(甚至适用)的方法,但我有时会制作简短的对象版本,用于引用其他对象。breif版本充当对象完整版本的基类,通常包含在此类对象列表中可见的信息。它通常不包含其他对象的列表,对其他类的任何引用通常都会引用该类的简短版本。这消除了一些不必要的数据加载,以及一些循环引用的情况。例如:

public class DepartmentBrief
{
    public string Name { get; set; }
}
public class Department : DepartmentBrief
{
    public Department()
    {
        Departments = new List<DepartmentBrief>();
    }
    public IEnumerable<DepartmentBrief> Departments { get; private set; }
}
public class UserBase
{
    public DepartmentBrief Department { get; set; }   
}
公共课部门简介
{
公共字符串名称{get;set;}
}
公共课系:系简介
{
公共部门()
{
部门=新列表();
}
公共IEnumerable部门{get;private set;}
}
公共类用户基
{
公共部门简报部门{get;set;}
}

这种方法与将完整对象引用与延迟加载相结合的方法之间的一个区别是,需要时需要显式加载额外数据。如果您有一个
UserBase
实例,并且需要该
UserBase
department
中的department列表,则需要编写一些代码来获取
department
对象,该对象是
UserBase
中的
DepartmentBrief
对象标识的。这可能会被认为是一个缺点,但我个人喜欢这样一个事实,即当代码即将进入数据存储时,查看代码会很清楚。

我不知道这是否是一种更好(甚至适用)的方法,但我有时会制作一些简短的对象版本,用于引用其他对象。breif版本充当对象完整版本的基类,通常包含在此类对象列表中可见的信息。它通常不包含其他对象的列表,对其他类的任何引用通常都会引用该类的简短版本。这消除了一些不必要的数据加载,以及一些循环引用的情况。例如:

public class DepartmentBrief
{
    public string Name { get; set; }
}
public class Department : DepartmentBrief
{
    public Department()
    {
        Departments = new List<DepartmentBrief>();
    }
    public IEnumerable<DepartmentBrief> Departments { get; private set; }
}
public class UserBase
{
    public DepartmentBrief Department { get; set; }   
}
公共课部门简介
{
公共字符串名称{get;set;}
}
公共课系:系简介
{
公共部门()
{
部门=新列表();
}
公共IEnumerable部门{get;private set;}
}
公共类用户基
{
公共部门简报部门{get;set;}
}

这种方法与将完整对象引用与延迟加载相结合的方法之间的一个区别是,需要时需要显式加载额外数据。如果您有一个
UserBase
实例,并且需要该
UserBase
department
中的department列表,则需要编写一些代码来获取
department
对象,该对象是
UserBase
中的
DepartmentBrief
对象标识的。这可能会被认为是一个缺点,但我个人喜欢这样一个事实,即当代码进入数据存储时,查看代码的确切时间会很清楚。

谢谢fretje,我不知道。谢谢fretje,我不知道。如果您通过其基类(DepartmentBrief)访问Department的实例,记忆中仍然是这个部门。因此,当您需要访问列表时,您必须先进行强制转换(这没有任何意义)。使用接口(或基类)是可以的,但是如果每个部门都有一个部门列表,那么它应该包含在该接口中。我看不出强制转换在性能上有什么不同。@Groo:问题是,在填充UserBase时,您并没有为其分配Department实例,而是分配DepartmentBase实例;内存中没有部门。如果您想要部门,您可以从DepartmentBase中选择信息,然后从数据存储中获取一个部门实例。明白了。DepartmentBrief的存在只是为了有一个用于引用数据存储的ID(如果我错了,请更正我)。但是,lazyinit或者一个具有相同接口的代理不是更好的解决方案吗?通过这种方式,您可以在考虑性能的情况下更改模型设计,这只是次要考虑的问题。我的意思是-如果你知道你的界面应该是什么样子,为什么要改变它?以后您可以很容易地将lazy init添加到任何属性中。@Groo:您的观点是正确的(因此我在回答中提到了lazy加载);使用延迟加载机制公开完整接口是另一种方法。是好是坏,我不知道。我个人喜欢“愚蠢”的模型,并明确地填充它们