我在SO上读到了使用属性而不是字段的好处,所以现在我想将我的代码从使用字段转换为使用属性。
对于类的实例字段,我可以设置默认值。例如:
int speed = 100;
对于等效属性,我认为应该是:
int Speed { get; set; }
我的理解是,当实例化一个类时,Speed属性会被初始化为零。但我无法找到如何设置默认值以便轻松更新我的代码。是否有一种优雅的方式来为属性提供默认值?
看起来应该有一种优雅的方法来做到这一点,而不需要使用构造函数,但我却找不到如何做。
我在SO上读到了使用属性而不是字段的好处,所以现在我想将我的代码从使用字段转换为使用属性。
对于类的实例字段,我可以设置默认值。例如:
int speed = 100;
对于等效属性,我认为应该是:
int Speed { get; set; }
最好的方法是使用普通的、老式的字段支持属性,例如:
private int _speed = 100;
public int Speed { get { return _speed; } set { _speed = value; } }
List<string>
的私有字段和一个用于获取/设置String[]
的属性,但我也可以使用获取/设置以获取CSV的String
。 - maxwellb我认为设置默认值最简单的方法是:
public sealed class Employee
{
public int Id { get; set; } = 10;
}
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; } }
}
你必须在构造函数中设置属性的默认值。对于自动属性,除此之外没有其他方法可以做到这一点,因为自动属性的字段是在编译时声明并在getter/setter中替换的。但是对于显式属性,你可以像Joe在他的答案中提到的那样初始化属性使用的字段以进行读取或写入。
CciSharp 支持 DefaultValue
属性,可以将默认值放置在自动属性上。然而,CciSharp 是否符合 "优雅" 的解决方案,则取决于个人观点(它作为编辑二进制文件中的 IL 的后编译器)。