如何给C#自动属性一个初始值?

我要么使用构造函数,要么恢复到旧语法。

使用构造函数:

class Person 
{
    public Person()
    {
        Name = "Initial Name";
    }
    public string Name { get; set; }
}

使用普通属性语法(具有初始值)

private string name = "Initial Name";
public string Name 
{
    get 
    {
        return name;
    }
    set
    {
        name = value;
    }
}

有更好的方法吗?


当前回答

我知道这是一个老问题,但当我在寻找如何使用重写选项继承默认值时,我想到了

//base class
public class Car
{
    public virtual string FuelUnits
    {
        get { return "gasoline in gallons"; }
        protected set { }
    }
}
//derived
public class Tesla : Car
{
    public override string FuelUnits => "ampere hour";
}

其他回答

在C#6及以上版本中,您可以简单地使用语法:

public object Foo { get; set; } = bar;

请注意,要具有只读属性,只需省略集合,如下所示:

public object Foo { get; } = bar;

您还可以从构造函数中指定只读自动属性。

在此之前,我的回答如下。

我会避免在构造函数中添加默认值;将其留给动态赋值,并避免在变量赋值的两个点(即默认类型和构造函数中)。在这种情况下,我通常只写一个普通属性。

另一个选项是执行ASP.Net的操作,并通过属性定义默认值:

http://msdn.microsoft.com/en-us/library/system.componentmodel.defaultvalueattribute.aspx

这已经过时了,我的立场已经改变了。我将把最初的答案留给子孙后代。


就我个人而言,如果你不打算在汽车产业之外做任何事情,我根本不认为把它变成一个产业有什么意义。把它当作一块场地。这些项目的封装优势只是红色的鲱鱼,因为它们背后没有什么可封装的。如果您需要更改底层实现,您仍然可以将其重构为财产,而不会破坏任何依赖代码。

嗯……也许这将是以后它自己的问题的主题

从C#6.0开始,我们可以为自动实现的财产指定默认值。

public string Name { get; set; } = "Some Name";

我们还可以创建只读的自动实现属性,如:

public string Name { get; } = "Some Name";

参见:C#6:第一反应,自动实现财产的初始化程序-Jon Skeet

你可以这样简单地

public sealed  class Employee
{
    public int Id { get; set; } = 101;
}

在C#(6.0)及更高版本中,您可以执行以下操作:

对于只读财产

public int ReadOnlyProp => 2;

对于可写和可读财产

public string PropTest { get; set; } = "test";

在当前版本的C#(7.0)中,您可以执行以下操作:(代码段显示了如何使用表达式体的get/set访问器,使其在与后台字段一起使用时更加紧凑)

private string label = "Default Value";

// Expression-bodied get / set accessors.
public string Label
{
   get => label;
   set => this.label = value; 
 }