【问题标题】:Initializing "Nested" objects初始化“嵌套”对象
【发布时间】:2013-11-08 00:35:47
【问题描述】:

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

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

例如,如果我有一堂课

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

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

但是,我被告知要初始化“所有子”复杂类型,尽管我认为这不应该是这种情况。为什么在我们没有数据时分配内存。您如何确定对象是否为空。您是比较所有值/定义某种滞后,还是定义一个专门的子类来表示空实例。

您的反馈将不胜感激。

【问题讨论】:

标签: c# object types initialization nested


【解决方案1】:

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

此外,如果您保持某些对象的某些部分未初始化,那么在访问/使用您的对象之前是否需要检查 null 时,开发人员会付出非常高的成本。

基本上,您可能会因不初始化某些字段而获得一些好处,但您需要花费大量时间来确保正确保护对属性的所有访问,以免访问null 字段。

【讨论】:

    【解决方案2】:

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

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

    不必担心,除非您拥有数百万个对象,或者您知道自己会拥有。

    【讨论】:

      【解决方案3】:

      你可以使用这个模式:

      Public class Person
      {
        private Address address;
      
        public Address Address 
        {
          get
          {
            return address ?? (address = new Address()); 
          }
        }
      }
      

      【讨论】:

      • 问题是我有一些基于子类型为“null”或“not”的逻辑。例如,如果地址为空,我可以让用户在屏幕上输入它,否则只显示为只读。那么我们是说“初始化”子类型更好吗?如果用户开始调用它的方法怎么办。这不会导致不可预测的行为吗?至少,如果对象为空,我至少会始终得到“空引用异常”。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多