Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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#_List_Design Patterns - Fatal编程技术网

C# 带有辅助对象的列表的优点/缺点

C# 带有辅助对象的列表的优点/缺点,c#,list,design-patterns,C#,List,Design Patterns,我再次能够找到一种方法来处理业务对象上带有辅助对象的列表 实际上,我们的代码通常如下所示: public class Object { private List<SubsidiaryObject> subsidiaryObjects = null; public List<SubsidiaryObject> SubsidiaryObjects { get { if (this.subsidia

我再次能够找到一种方法来处理业务对象上带有辅助对象的列表

实际上,我们的代码通常如下所示:

public class Object
{
    private List<SubsidiaryObject> subsidiaryObjects = null;
    public List<SubsidiaryObject> SubsidiaryObjects
    {
        get
        {
            if (this.subsidiaryObjects == null)
            {
                this.subsidiaryObjects = DBClass.LoadListFromDatabase();
            }

            return this.subsidiaryObjects;
        }

        set
        {
            this.subsidiaryObjects = value;
        }
    }
}
公共类对象
{
私有列表子日志对象=null;
公共列表子日志对象
{
得到
{
if(this.subsidiaryObjects==null)
{
this.subdiaryObjects=DBClass.LoadListFromDatabase();
}
返回this.subdiaryobjects;
}
设置
{
this.subdiaryobjects=值;
}
}
}
关于这一点的反对意见是:

  • 该属性在表示层中引用,并用于数据绑定。释放对实际列表的引用并用新列表替换它将在GUI中的引用列表中结束,该列表在对象上没有任何剩余内容
专业人士在这方面:

  • 重新加载列表的简单方法(只需将引用设置为null,然后再次获取它)
我开发了另一个使用以下模式的类:

public class Object2
{
    private readonly List<SubsidiaryObject> subsidiaryObjects = new List<SubsidiaryObject>();
    public List<SubsidiaryObject> SubsidiaryObjects
    {
        get
        {
            return this.subsidiaryObjects;
        }
    }

    public void ReloadSubsidiaryObjects()
    {
        this.SubsidiaryObjects.Clear();
        this.SubsidiaryObjects.AddRange(DBClass.LoadListFromDatabase());
    }
}
公共类对象2
{
私有只读列表子日志对象=新列表();
公共列表子日志对象
{
得到
{
返回this.subdiaryobjects;
}
}
public void ReloadSubsidiaryObjects()
{
this.subdiaryobjects.Clear();
this.SubsidiaryObjects.AddRange(DBClass.LoadListFromDatabase());
}
}
关于这一点:

  • 引用是连续的
关于这一点的反对意见是:

  • 重新加载列表更加困难,因为它不能被替换,但必须清除/填充重新加载的项目
在什么情况下,你更喜欢哪种方式

对于这两种模式,您认为哪些是赞成/反对的


因为这只是一个一般性问题,而不是针对某个特定问题,所以欢迎您给出每一个答案。

您需要来电者修改列表吗?如果不是,你应该考虑返回<代码> iQueabd或 RealOnLyCyto。即使您这样做了,您也可能会更好地制作
添加
/
删除
的封面版本,以便拦截修改。在国际海事组织(IMO)中,将引用交给内部状态不是一个好主意


第三个选项是使用选项2,但每次需要重新填充列表时都要创建
Object2
类型的新实例。如果没有问题的附加上下文,这是我将选择的选项,但是您可能有理由希望保留原始实例

事实上,持有原始实例的主要原因是,它本身是一个附属对象。。。除了顶层的例外。