协慌网

登录 贡献 社区

如何为 C#Auto-Property 提供默认值?

如何为 C#Auto-Property 提供默认值?我要么使用构造函数,要么还原为旧语法。

使用构造函数:

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

使用普通属性语法 (使用默认值)

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

有没有更好的办法?

答案

在 C#5 和更早版本中,要为自动实现的属性提供默认值,您必须在构造函数中执行此操作。

自 C#6.0 以来,包含自动属性初始化程序的能力。语法是:

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

编辑 1/2/15

使用 C#6,您可以直接初始化自动属性(最后!),现在线程中有其他答案可以描述。

对于 C#5 及以下:

虽然属性的预期用途不是实际设置属性的值,但您可以使用反射始终设置它们...

public class DefaultValuesTest
{    
    public DefaultValuesTest()
    {               
        foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(this))
        {
            DefaultValueAttribute myAttribute = (DefaultValueAttribute)property.Attributes[typeof(DefaultValueAttribute)];

            if (myAttribute != null)
            {
                property.SetValue(this, myAttribute.Value);
            }
        }
    }

    public void DoTest()
    {
        var db = DefaultValueBool;
        var ds = DefaultValueString;
        var di = DefaultValueInt;
    }


    [System.ComponentModel.DefaultValue(true)]
    public bool DefaultValueBool { get; set; }

    [System.ComponentModel.DefaultValue("Good")]
    public string DefaultValueString { get; set; }

    [System.ComponentModel.DefaultValue(27)]
    public int DefaultValueInt { get; set; }
}

当你为变量内联一个初始值时,无论如何都会在构造函数中隐式地完成它。

我认为这种语法是 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"