初始化“嵌套”对象

时间:2013-10-29 01:58:49

标签: c# object types initialization nested

我有一个复杂的c#类,它有几个平面成员和几个嵌套的复杂类型。

作为一般惯例,如果没有数据,我不会初始化“嵌套”复杂类型。

例如,如果我有一个班级

Public class Person
{
 public string FirstName{get;set;}
 public Address{get;set;}
}

我不会Person p = new Person(){FirstName="Test", Address = new Address()};

然而,我很想初始化“所有子”复杂类型,即使在我看来这不应该是这种情况。为什么在没有数据时分配内存。你如何判断对象是否为空。您是否比较所有值/定义某种滞后,或定义一个专门的子类来表示空实例。

我们将非常感谢您的反馈意见。

3 个答案:

答案 0 :(得分:1)

在访问之前检查null的每个属性的运行时成本可能高于使用“空”对象初始化所有字段(请参阅Null Object pattern)。 “空”/“空对象”的内存成本可能非常小,因为您只需在所有对象之间共享单个只读实例。

此外,如果您保留某些对象的某些部分未初始化,那么在访问/使用您的对象之前,如果需要进行null检查,您需要花费很高的成本来查找。

基本上,您可能会因为没有初始化某些字段而获得一些好处,但是您需要花费大量时间来确保所有对属性的访问都能够正确地防止访问null字段。

答案 1 :(得分:0)

为了简单起见,您可以在构造函数内部进行初始化:

public class Person
{
    public Person()
    {
        this.Address = new Address();
    }
    public string FirstName {get; set;}
    public Address {get; set;}
}

// Don´t need to do Person p = new Person(){ FirstName="Test", Address = new Address()}; 
Person p = new Person();

除非你有数百万个物品,否则你不必担心,或者你知道你会有。

答案 2 :(得分:0)

您可以使用此模式:

Public class Person
{
  private Address address;

  public Address Address 
  {
    get
    {
      return address ?? (address = new Address()); 
    }
  }
}