C# 为什么';实例化一个对象会自动实例化它的属性吗?

C# 为什么';实例化一个对象会自动实例化它的属性吗?,c#,.net,instance,C#,.net,Instance,我有以下课程: public class CustomerResult { public string CompanyStatus { get; set; } public OverallResult Result { get; set; } } public class OverallResult { public string StatusDescription { get; set; } public int StatusCode { get; set;

我有以下课程:

public class CustomerResult
{
    public string CompanyStatus { get; set; }
    public OverallResult Result { get; set; }
}

public class OverallResult
{
    public string StatusDescription { get; set; }
    public int StatusCode { get; set; }
    public string CustomerId { get; set; }        
}
我举例说明:

var apiResult = new CustomerResult();
为什么下面的语句返回空引用?当我创建
CustomerResult()
时,肯定会实例化
OverallResult


因为您没有为
Result
创建实例。默认情况下,引用类型具有空值,
OverallResult
是一个类,因此是引用类型

您可以在构造函数中完成它

public class CustomerResult
{
    public string CompanyStatus { get; set; }
    public OverallResult Result { get; set; }
    public CustomerResult(){
        Result = new OverallResult();
    }
}

如果您的
C#
版本高于6.0,有一种更简单的方法

C#6允许您在自动属性声明中为自动属性使用的存储分配初始值:


子对象不会自动实例化的原因之一是,您可能不想调用默认构造函数,或者甚至想强制程序员调用具有足够参数的构造函数来正确初始化类,因此没有公共默认构造函数

您可能会争辩说,如果有一个默认构造函数,那么它应该总是运行,然后是您真正想要的构造函数,但是您要做两次相同的工作

public class CustomerResult
{
   public string CompanyStatus { get; set; }
   public OverallResult Result { get; set; }
}

public class OverallResult
{
   public OverallResult()
   {
       StatusCode = 55;
       StatusDescription = "Nothing to see";
   }
   public OverallResult(int statusCode, string status)
   {
      StatusCode = statusCode;
      StatusDescription = status;
   }
   public string StatusDescription { get; set; }
   public int StatusCode { get; set; }
   public string CustomerId { get; set; }        
}

void main()
{
   var result = new CustomerResult()
   {
       Result = new OverallResult(51, "Blah"),
   };
}

不,它没有实例化。原语值将自动为您保留默认值,它不会创建对象的实例,但该对象是您的
OverallResult
。当没有代码执行该实例化时,为什么要实例化
OverallResult
属性?实例化一个对象不会自动实例化它的所有属性在你的代码中。我试着给你一个更好的标题。如果你觉得我没有抓住要点,请随意编辑。这就是为什么程序员认为编写构造函数很有用的原因。同样值得注意的是#6前向编译中使用的自动属性在构造函数中设置属性,如第一个示例中所示。语法糖。
public class CustomerResult
{
    public string CompanyStatus { get; set; }
    public OverallResult Result { get; set; } = new OverallResult();
}
public class CustomerResult
{
   public string CompanyStatus { get; set; }
   public OverallResult Result { get; set; }
}

public class OverallResult
{
   public OverallResult()
   {
       StatusCode = 55;
       StatusDescription = "Nothing to see";
   }
   public OverallResult(int statusCode, string status)
   {
      StatusCode = statusCode;
      StatusDescription = status;
   }
   public string StatusDescription { get; set; }
   public int StatusCode { get; set; }
   public string CustomerId { get; set; }        
}

void main()
{
   var result = new CustomerResult()
   {
       Result = new OverallResult(51, "Blah"),
   };
}