我已经看过堆栈溢出但所有答案似乎分支略有不同。
我想知道,简单明了。为什么这个标准做法?
为什么要为属性创建私有局部变量?
为什么这个标准练习在我看过的一些专业代码中写过?
private int _widget;
public int widget
{
get{ return _widget; }
set{ _widget = value; }
}
这不是多余而浪费的吗?
没有人直接调用私有变量。你总是通过财产设置它。
为什么不把它搞定?
使用此功能时是否有我不知道的黑暗魔法?
public int widget {get; set;}
答案 0 :(得分:3)
如果您只是看一个简单的例子,那么你是对的,这看起来很浪费。
... BUT 还有更多。
这是一篇更深入的文章:Why Properties Matter 通过Stack Overflow传奇 Jon Skeet 。
首先,不公开公开类字段已成为最佳实践规则。你无法控制他的价值所发生的事情。但是,如果您使用属性,则可以根据需要随时添加在引擎盖下发生的其他逻辑,而无需将任何内容更改为类的公共接口。这可以是用于处理对网络/数据库等有限资源的多次访问的代码......
其次,对于带有支持字段的版本,您可以非常轻松地实现INotifyPropertyChanged
接口,以便使用 WPF 和Model-View-ViewModel(MVVM)模式的值: / p>
public string FavoriteColor
{
get
{
return this.favoriteColor;
}
set
{
if (value != this.favoriteColor)
{
this.favoriteColor = value;
if (this.PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs("FavoriteColor"));
}
}
}
}
(取自Basic MVVM QuickStart的代码段)
第三:但如果您需要从公共字段更改为属性 - 将获得不同的IL代码 - 您将失去二进制兼容性。这可能会影响序列化并重新编译访问更改的类的其他程序集中的代码。如果您在部分更新中部署应用程序而不是同时部署所有程序集,那么这将是不好的。
另一方面,您可以使用支持字段或自动属性来实现属性,在这两种情况下,您将获得相同的IL代码,这意味着您可以减少破坏某些内容的风险。
答案 1 :(得分:2)
在C#3.0之前,自动属性(或auto-implemented properties)不可用。
第一个变体(带有支持字段)的一个优点是,您可以将其值初始化为非默认值,而无需实现构造函数,例如:
private int _widget = 123;
public int widget
{
get{ return _widget; }
set{ _widget = value; }
}
答案 2 :(得分:0)
正如@pswg和@Brandon所说,这是一个在.Net 3.0上添加的一个名为Auto-Implemented属性的功能,我们的想法是你不再需要在你的类中声明私有变量,只需要公共属性和所有必需的处理以支持由框架完成。
回到过去,我们需要写下你的第一个例子,我知道那些人仍然喜欢这样。
您可以在此处查找:http://msdn.microsoft.com/en-us/library/bb384054.aspx