是否需要明确初始化属性?

时间:2016-02-23 16:48:07

标签: 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 initialization needed?
}

4 个答案:

答案 0 :(得分:4)

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

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

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

    public DeviceSettings ds{ get; private set; }
}

答案 1 :(得分:3)

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

当您想要使用默认值初始化属性时,

属性初始化程序可以帮助您,例如:

private DateTime CreateOn { get; } = DateTime.UtcNow; 

这被翻译成这样的东西:

private readonly createOn= DateTime.UtcNow;
public DateTime CreateOn 
{ 
   get
     {
        return createOn;
     } 
}

这是一个在初始化后将保持不变的属性。

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

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

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

答案 2 :(得分:2)

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

该语法仅在C#6.0中引入。所以完全没问题就不要初始化它。在这种情况下,它将获得默认值(取决于DeviceSettings,是值还是引用类型)

答案 3 :(得分:1)

不需要初始化来实例化你的类。

如果您要使用属性,则需要将其初始化为具有正确的值(它将主要为null,因为在许多情况下null是默认值,除非您重新定义它或使用结构) 。你可以用C#6语法糖作为你的第一个例子,或者在构造函数中。