2010-06-30 56 views
5

我读过,有很好的理由使用属性,而不是在SO上的c#中的字段。所以现在我想将我的代码从使用字段转换为使用属性。有没有一种优雅的方式来为c#中的属性设置默认值?

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

int speed = 100; 

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

int Speed { get; set; } 

我的理解是,当类实例化速度属性将被初始化为零。我一直无法找到如何设置一个默认值来轻松更新我的代码。有没有一种优雅的方式为财产提供默认值?

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

+0

有什么不对使用构造?或者使用具有手动定义的后台字段而不是自动属性的属性? – 2010-06-30 03:46:20

+0

如果我可以将字段更改为与先前声明的字段相同的位置中的属性,它将使我的转换任务更加轻松。使用构造函数我需要滚动我的代码才能进行更改。我不知道你可以使用已初始化的支持字段。 – 2010-06-30 03:51:40

+0

C#6中的新功能:[自动属性的初始化工具](https://github.com/dotnet/roslyn/wiki/New-Language-Features-in-C%23-6#auto-property-enhancements) – 2015-08-06 19:26:53

回答

7

最好的办法是做一个普通的老式场支持的特性,如:

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

谢谢代码。这非常优雅,我不必使用构造函数。辉煌。 – 2010-06-30 03:52:35

+0

没有问题。这是您在.NET 3.0之前编写代码的所有时间都会看到的内容。使用3.0时,引入了自动属性,但是遇到了您提出的问题,无法简单地定义默认值,而无需使用构造函数。 – 2010-06-30 03:54:51

+0

我仍然喜欢旧的做属性的方法,但它可能会导致混淆,因为您不知道从课堂内部获取/设置valueu的方式。你使用实例变量还是使用该属性? – 2010-06-30 04:09:33

1

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

0

的构造是设置一个自动属性的初始值的唯一途径。

1

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

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; } } 
    } 
相关问题