自动属性与默认值

21

只有在VB.NET中才能使用:公共属性HowHigh的整数默认值为42。在C#中,这个语法会稍微有点不同。 - Hans Passant
5
我想要这个:public int HowHigh { get; set; } = 5; - Jerry Nixon
4
@JerryNixon-MSFT: [自C# 6.0发布以来,你一定感到非常高兴] (http://www.kunal-chowdhury.com/2014/11/csharp-6-auto-property.html#wQAWULz9VA5JbyLK.97) :) - Flater
5个回答

13

最好的做法是在构造函数中设置它,你无法在自动属性内进行更改,否则你需要一个后备字段并自己实现setter/getter。

使用后备字段,你可以这样写:

private int _howHigh = 0;
public int HowHigh { get {return _howHigh; }  set { _howHigh = value; } }

我相信这是最好的解决方案。 - Jerry Nixon

13

没有一种好的方法来做到这一点-基本上你必须在构造函数中设置它,这不是很愉快。

自动属性有各种限制-我最大的抱怨是没有一种方法可以创建一个只读的自动属性,在构造函数中设置但其他地方不能设置(并由只读字段支持)。


+1 仅限于构造函数以外的只读。鉴于我想要实现的某个设计,我会为此付出一切。 - Moo-Juice
2
我能否建议在C# 5中为此提供一个新的属性?DefaultValueAttribute会非常完美 :) - Dercsár
2
@Dercsar:我认为这里不应该使用属性。我更愿意看到一种语言的改变。毕竟,它只是一种语言的语法糖。但我非常怀疑我们会在C# 5中看到它。 - Jon Skeet
2
@hunter:不是的,因为那不是真正的只读。它仍然可以在类内部进行写操作...而且支持变量也是可写的。此外,如果您希望类能够改变值,通常情况下设置私有setter是有意义的。您的代码应该能够轻松地声明该属性不会更改。目前,您必须通过单独声明变量和一个只读属性来实现这一点:( - Jon Skeet
@John:根据实现方式,VB 可能在这方面做得更好。你知道它是否支持只读自动属性吗?我读过 C# 和 Java 语言规范,但还没有读过 VB 的 :) - Jon Skeet
显示剩余4条评论

11
如果类型的默认值不足够,那么唯一的方法就是通过构造函数来实现。

3

简而言之:不行。

自动属性只是一个小技巧,一旦你需要额外的东西(比如合理的默认值),你应该回归到使用支持字段的常规属性。

我是Resharper用户,它可以轻松地将自动属性转换为支持字段的属性。


2

构造函数并不是你唯一的选择。

我认为这是最好的选择:

private int m_HowHigh = 5; 
public int HowHigh { 
    get { return m_HowHigh; }  
    set { m_HowHigh = value; } 
} 

为了更好的可读性,我更喜欢这种方式而不是使用ctor()。

这不是你想要的:

[DefaultValue(5)]
public int HowHigh { get; set; }

参考:http://msdn.microsoft.com/en-us/library/system.componentmodel.defaultvalueattribute.aspx#Y2248

因为这只是一个装饰而不会设置值(在C#4中)。


但这不是自动属性。 - John Demetriou
在这种情况下,构造函数你唯一的选择。 - Jerry Nixon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接