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

有更好的方法吗?


当前回答

当内联变量的初始值时,无论如何都会在构造函数中隐式完成。

我认为这种语法是C#中的最佳实践,最高可达5:

class Person 
{
    public Person()
    {
        //do anything before variable assignment

        //assign initial values
        Name = "Default Name";

        //do anything after variable assignment
    }
    public string Name { get; set; }
}

因为这样可以清楚地控制分配的顺序值。

从C#6开始,有一种新的方式:

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

其他回答

你可以这样简单地

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

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

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

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

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

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

少量完整样品:

using System.ComponentModel;

private bool bShowGroup ;
[Description("Show the group table"), Category("Sea"),DefaultValue(true)]
public bool ShowGroup
{
    get { return bShowGroup; }
    set { bShowGroup = value; }
}
class Person 
{    
    /// Gets/sets a value indicating whether auto 
    /// save of review layer is enabled or not
    [System.ComponentModel.DefaultValue(true)] 
    public bool AutoSaveReviewLayer { get; set; }
}

在C#9.0中添加了对init关键字的支持,这是一种非常有用且非常复杂的声明只读自动属性的方法:

声明:

class Person 
{ 
    public string Name { get; init; } = "Anonymous user";
}

~享受~使用:

// 1. Person with default name
var anonymous = new Person();
Console.WriteLine($"Hello, {anonymous.Name}!");
// > Hello, Anonymous user!


// 2. Person with assigned value
var me = new Person { Name = "@codez0mb1e"};
Console.WriteLine($"Hello, {me.Name}!");
// > Hello, @codez0mb1e!


// 3. Attempt to re-assignment Name
me.Name = "My fake"; 
// > Compilation error: Init-only property can only be assigned in an object initializer