具有默认值的自动属性[重复]

Posted

技术标签:

【中文标题】具有默认值的自动属性[重复]【英文标题】:automatic property with default value [duplicate] 【发布时间】:2011-01-14 14:08:17 【问题描述】:

可能重复:How do you give a C# Auto-Property a default value?

有没有什么好方法可以为自动属性提供默认值?

public int HowHigh get; set; // defaults to 0

如果没有在任何地方明确设置,我希望它是 5。你知道一个简单的方法吗?例如。我可以在构造函数或其他东西中设置它,但这并不优雅。

更新:C# 6 得到了它:http://geekswithblogs.net/WinAZ/archive/2015/06/30/whatrsquos-new-in-c-6.0-auto-property-initializers.aspx

【问题讨论】:

仅在 VB.NET 中:公共属性 HowHigh As Integer = 42。这将是 C# 中的粗略语法。 我想要这个:public int HowHigh get; set; = 5; @JerryNixon-MSFT: You must feel so happy since C# 6.0 released :) 【参考方案1】:

不,没有什么好的方法可以做到这一点 - 基本上你必须在构造函数中设置它,这并不令人愉快。

像这样的自动属性有各种限制——我最大的抱怨是没有办法创建只读自动属性,它可以在构造函数中设置,但不能在其他任何地方设置(并由只读字段支持) .

【讨论】:

+1 表示只读,构造函数除外。考虑到我想要实现的某种设计,我会为此而杀。 我可以在 C# 5 中为此提出一个新属性吗? DefaultValueAttribute 将是完美的:) @Dercsar:我不认为属性是这里的方法。我宁愿看到语言的变化。毕竟,它是一块语言语法糖。我非常怀疑我们会在 C# 5 中看到它。 “我最大的抱怨”是否有一个私人二传手为财产工作? @hunter:不,因为那不是真正的只读。它在类中仍然是可写的......并且支持变量也将是可写的。除了其他任何事情之外,如果您希望 类能够改变值,那么拥有一个私有设置器通常是有意义的。您的代码应该能够轻松声明此属性不会更改。目前,您必须通过单独声明变量和 getter-only 属性来做到这一点:(【参考方案2】:

你能做的最好的就是在构造函数中设置它,你不能在自动属性中进行更改,你需要一个支持字段并自己实现 setter/getter。

使用支持字段,您可以编写如下内容:

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

【讨论】:

我相信这是最好的解决方案【参考方案3】:

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

【讨论】:

【参考方案4】:

一句话:没有。

自动属性是一种技巧,只要您需要一些额外的东西(例如合理的默认值),您就应该恢复到支持字段的常规属性。

我是 Resharper 用户,它使从自动属性到支持属性变得轻而易举。

【讨论】:

【参考方案5】:

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

我认为这是最好的:

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 中)。

【讨论】:

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

以上是关于具有默认值的自动属性[重复]的主要内容,如果未能解决你的问题,请参考以下文章

EF 6:添加具有默认值的新属性不起作用[重复]

具有默认值的 Swift public var 并为该默认值运行 didSet [重复]

JavaScriptSerializer 可以排除具有空值/默认值的属性吗?

ODataActionParameters 具有具有默认值的属性

AutoBeanCodex.encode 省略了具有默认值的属性

为具有闭包默认值的属性设置委托