有没有一种优雅的方法来为c#中的属性设置默认值?

时间:2010-06-30 03:44:33

标签: c# properties initialization field default-value

我已经读过,有充分的理由在SO上使用属性而不是c#中的字段。所以现在我想将我的代码从使用字段转换为使用属性。

对于类的实例字段,我可以设置默认值。例如:

int speed = 100;

对于等效的属性,我认为是:

int Speed { get; set; }

我的理解是,在实例化类时,Speed属性将初始化为零。我一直无法找到如何设置默认值来轻松更新我的代码。是否有一种优雅的方式来为属性提供默认值?

似乎应该有一种优雅的方式来做到这一点,而不使用构造函数,但我无法找到如何。

6 个答案:

答案 0 :(得分:7)

最好的办法是做一个正常的老式现场支持的财产,如:

private int _speed = 100;
public int Speed { get { return _speed; } set { _speed = value; } }

答案 1 :(得分:2)

我使用的设计模式,在整个Microsoft的Windows.Forms控件和其他.NET类中使用。而且,根据我的理解,构造函数之外的初始化允许实时编译器优化类代码。

public class Foo {
    public static const int DefaultSpeed = 100;
    private int _speed = DefaultSpeed;
    [DefaultValue(DefaultSpeed)]
    public int Speed { get { return _speed; } set { _speed = value; } }
}

    public class Foo {
        public static Color DefaultForecolor { get {return SystemColors.WindowText; }}
        private Color _forecolor = DefaultForecolor;
        [DefaultValue(DefaultForeColor)]
        public Color Forecolor { get { return _forecolor; } set { _forecolor = value; } }
    }

答案 2 :(得分:1)

您必须在构造函数中设置属性的默认值。除此之外没有其他方法可以用于自动属性,因为自动道具的字段在编译时声明并在getter / setter中替换。但是在显式属性中,您可以初始化属性用于读取或写入的字段,如Joe在其答案中所述。

答案 3 :(得分:1)

构造函数是设置auto属性初始值的唯一方法。

答案 4 :(得分:1)

CciSharp支持DefaultValue attribute,它允许在自动属性上放置默认值。然而,CciSharp是否有资格作为“优雅”的解决方案是一个意见问题(它充当后编译器,编辑二进制文件中的IL)。

答案 5 :(得分:1)

我认为设置默认值最简单的方法:

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