【问题标题】:C# constructor initializing properties instead of fields?C# 构造函数初始化属性而不是字段?
【发布时间】:2017-04-09 16:46:50
【问题描述】:

假设你必须使用构造函数来初始化一些字段......

class Foo
{
    private int price;
    public Foo(int price)
    {
        this.price = price;
    }
}

我知道通常构造函数会初始化一些字段,但是如果我用它初始化属性有什么区别。例如

class Foo
{
    private int price { get; set; }
    public Foo(int price)
    {
        this.price = price;
    }
}

代码似乎工作相同,但我的问题是这是否是一种好习惯,我应该这样做吗?

【问题讨论】:

    标签: c# constructor properties field


    【解决方案1】:

    构造函数可以初始化属性,但很少有私有自动实现的属性很有用。对于 non-private 状态(无论这些属性是否自动实现),我总是使用属性而不是字段,并且私有属性在它们不重要时才有意义,例如执行验证或其他一些计算。但是,如果我希望将私有字段用于仅理解属性的基于反射的库之类的东西,我只会将其转换为私有自动实现的属性。

    【讨论】:

      【解决方案2】:

      没问题。

      为了获得更大的灵活性(例如,如果价格不是必需的),您还可以通过对象初始化来做到这一点:

      class Foo
      {
          public Foo() {}
      
          public int Price { get; set; }
      }
      
      var newFoo = new Foo(){ Price = someVariable };
      

      见:https://msdn.microsoft.com/en-us/library/bb397680.aspx

      【讨论】:

        猜你喜欢
        • 2011-03-28
        • 1970-01-01
        • 1970-01-01
        • 2012-04-11
        • 2018-06-25
        • 2018-06-30
        • 1970-01-01
        • 2017-06-13
        • 2015-09-11
        相关资源
        最近更新 更多