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

有更好的方法吗?


当前回答

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

其他回答

我认为这可以让SomeFlag默认为false。

private bool _SomeFlagSet = false;
public bool SomeFlag
{
    get
    {
        if (!_SomeFlagSet)
            SomeFlag = false;        

        return SomeFlag;
    }
    set
    {
        if (!_SomeFlagSet)
            _SomeFlagSet = true;

        SomeFlag = value;        
    }
}

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


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

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

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

在C#5和更早版本中,要给自动实现的财产一个初始值,必须在构造函数中完成。

从C#6.0开始,您可以在线指定初始值。语法为:

public int X { get; set; } = x; // C# 6 or higher

DefaultValueAttribute用于VS设计器(或任何其他使用者)指定默认值,而不是初始值。(即使在设计对象中,初始值也是默认值)。

在编译时,DefaultValueAttribute不会影响生成的IL,并且不会读取该属性以将属性初始化为该值(请参阅DefaultValue属性不适用于我的自动属性)。

影响IL的属性示例有ThreadStaticAttribute、CallerMemberNameAttribute。。。

在构造函数中。构造函数的目的是初始化它的数据成员。