C#对象初始化的最佳实践

时间:2012-07-11 19:20:21

标签: c# object

我有一个Order对象,Order对象包含一个Person对象,该对象存储有关下订单的人的信息。当我填充Order对象时,我应该填充Person对象吗?或者,每当我需要访问下订单的人时,我会更好地调用order.GetPerson()。

4 个答案:

答案 0 :(得分:2)

您可以考虑使用LazyLoading方法。这样,Person数据将在需要时被提取和加载(第一次查询)

  

延迟加载是计算机编程中常用的设计模式   将对象的初始化推迟到它所在的点   需要

答案 1 :(得分:0)

如果资源是一个问题,那么Shyju的答案是有道理的。否则,如果您始终知道与订单关联的人,那么,填写它。此外,尽可能经常使对象不可变是一个好主意,在这种情况下你可能会这样做;即通过构造函数传递此人并且永远不会更改它。

答案 2 :(得分:0)

  

如果未设置Order属性,Person对象是否有效?

如果必须将order.Person设置为Person对象以使order处于有效状态,那么您很可能希望Order构造函数接受Person对象。这是因为构造函数应该始终构造有效的对象,而不仅仅是部分有效的对象。

public class Order
{
    public Order(Person person)
    {
        this.person = person;      
    }

    public Person Person { get { return person; } }
    readonly Person person;
}

另一方面,如果order.Person不需要初始化Order以使Person有效,那么您的构造函数不需要Person参数。相反,您可以使public class Order { public Order() { … } public Person Person { get; set; } } 成为可读写属性:

Person

如果您这样做,请回答以下问题:

  

Person属性可以多次设置到不同的Person实例是否有意义?

如果是,那么上面显示的方法一切都很好。

但是,我会回答“否”:订单只能由一个 public Person Person { get { return person; } set { if (person != null) throw new InvalidOperationException; person = value; } } Person person; 发出,而这在以后不会改变。你可以考虑让属性只能设置一次,后续尝试设置它会触发异常:

Person

......但这可能不是很直观。更好的方法可能是从构造函数设置Order属性并使属性为只读(如上所示)。这可能看起来过于严格,但对于{{1}}对象的所有用户来说可能更直观。

答案 3 :(得分:0)

正如Chris Sinclair的评论所指出的那样,它确实归结为您的设计,并考虑到您需要Person对象的频率。如果几乎每次加载Orders时,您都需要关联的Persons(用于显示或计算等),那么始终加载Persons以限制数据库调用的数量是有意义的。如果您几乎不需要Person数据,那么以后期绑定/延迟加载方式获取Person数据会更有意义。

考虑这个例子。您检索所有订单以在网格中显示它们。但是当您填充网格时,您还希望显示每个订单的人员信息。如果您使用每个订单加载Person数据,您只需循环订单,您就不再有数据库调用。如果您使用延迟加载Person数据,那么当您循环订单时,您必须为每个Order进行额外的数据库调用以获取Person数据。这是很多电话。

如果合适,您还可以拆分差异和设计加载方法,您可以将标记传递给“LoadChildren”。这样做可以为您提供最大的灵活性,但牺牲了可维护性/可读性,因为根据您在代码中的位置,您不一定知道Person数据是否已填充。