C# 属性是否需要显式初始化?

C# 属性是否需要显式初始化?,c#,.net,c#-6.0,C#,.net,C# 6.0,属性是否需要这样显式初始化: public DeviceSettings ds{ get; private set; } = new DeviceSettings(); 还是可以保持这种状态? public class MyDevice { public MyDevice(string serial, int patientid) { } public DeviceSettings ds{ get; private set; } //no initializ

属性是否需要这样显式初始化:

public DeviceSettings ds{ get; private set; } = new DeviceSettings();
还是可以保持这种状态?

public class MyDevice
{
    public MyDevice(string serial, int patientid)
    {

    }

    public DeviceSettings ds{ get; private set; } //no initialization needed?
}

在第一个示例中,
ds
被设置为
DeviceSettings
的一个新实例,在第二个示例中,
ds
被设置为
default(DeviceSettings)
,如果该类型是一个类,它将为
null

如果您希望使用第二种方法,并且您的类型是一个类,则需要在构造函数中添加赋值

public class MyDevice
{
    public MyDevice(string serial, int patientid)
    {
        ds = new DeviceSettings();
    }

    public DeviceSettings ds{ get; private set; }
}

实例化类不需要初始化

如果要使用属性,则需要初始化它以获得正确的值(它主要为null,因为null在许多情况下是默认值,除非重新定义它或使用结构)。您可以使用C#6 syntaxic sugar作为第一个示例,也可以使用构造函数

public DeviceSettings ds{ get; private set; } = new DeviceSettings();

这种语法只在C#6.0中引入。所以它是完全好的,不要初始化它。在这种情况下,它将获得默认值(取决于设备设置,是值还是引用类型)

属性不需要在创建类的新实例时初始化。这主要取决于您的业务逻辑

属性初始值设定项可以帮助您使用默认值初始化属性,例如:

private DateTime CreateOn { get; } = DateTime.UtcNow; 
也就是说:

private readonly createOn= DateTime.UtcNow;
public DateTime CreateOn 
{ 
   get
     {
        return createOn;
     } 
}
这是一个在初始化后将保持不变的属性

正如@ScottChamberlain在他的回答中指出的,您可以在类的构造函数中初始化。如果这取决于作为参数传递给构造函数的外部值,那么这是初始化属性的好地方,例如:

public class Product
{
  private PriceCalculator Calculator {get;set;}
  public decimal Price{get {return Calculator.GetPrice();}}

  public Product(int factor)
  {
    Calculator=new PriceCalculator(factor);
  }
}

@Sinatr
private
不是
readonly
。不需要属性初始化。它将用默认值初始化