如何给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;
    }
}

有更好的方法吗?


当前回答

private string name;
public string Name 
{
    get 
    {
        if(name == null)
        {
            name = "Default Name";
        }
        return name;
    }
    set
    {
        name = value;
    }
}

其他回答

除了已经接受的答案外,对于要将默认属性定义为其他财产的函数的场景,您可以在C#6.0(及更高版本)上使用表达式体表示法来实现更优雅、更简洁的结构,如:

public class Person{

    public string FullName  => $"{First} {Last}"; // expression body notation

    public string First { get; set; } = "First";
    public string Last { get; set; } = "Last";
}

您可以按以下方式使用以上内容

    var p = new Person();

    p.FullName; // First Last

    p.First = "Jon";
    p.Last = "Snow";

    p.FullName; // Jon Snow

为了能够使用上述“=>”表示法,属性必须是只读的,并且不使用get accessor关键字。

MSDN上的详细信息

private string name;
public string Name 
{
    get 
    {
        if(name == null)
        {
            name = "Default Name";
        }
        return name;
    }
    set
    {
        name = value;
    }
}

在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 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; 
 }

有时,如果我不希望它被实际设置并保存在我的数据库中,我会使用它:

class Person
{
    private string _name; 
    public string Name 
    { 
        get 
        {
            return string.IsNullOrEmpty(_name) ? "Default Name" : _name;
        } 

        set { _name = value; } 
    }
}

显然,如果它不是一个字符串,那么我可能会使对象可以为null(double?,int?),并检查它是否为null,返回默认值,或返回它设置的值。

然后,在保存之前,我可以在存储库中进行检查,看看它是否是我的默认值,并且不存在,或者进行后门检查,查看备份值的真实状态。