我查看了堆栈溢出,但所有答案似乎都略有不同。
我想知道,简单明了。为什么这是标准做法?
为什么要为属性创建私有(private)局部变量?
为什么我看到的任何专业代码中都有这种标准做法?
private int _widget;
public int widget
{
get{ return _widget; }
set{ _widget = value; }
}
这看起来是不是多余和浪费比特?
没有人直接调用私有(private)变量。您始终通过属性设置它。
为什么不直接取消它呢?
使用它时是否存在我不知道的黑魔法?
public int widget {get; set;}
如果你只是看简单的例子,你是对的,它看起来很浪费。
但是...
还有更多。
这是一篇更深入的好文章:Why Properties Matter
作者:Stack Overflow 传奇 Jon Skeet。
首先,不公开类字段已成为最佳实践规则。你无法控制他的值(value)会发生什么。但是,如果您改用属性,则可以根据需要添加在幕后发生的额外逻辑,而无需对类的公共(public)接口(interface)进行任何更改。这可能是用于处理对有限资源(如网络/数据库等)的多次访问的代码......
其次,使用带有支持字段的版本,您可以非常轻松地实现 INotifyPropertyChanged
接口(interface),以便将值与 WPF 和 Model-View-ViewModel (MVVM) 一起使用图案:
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 )
第三:但是如果您需要从公共(public)字段更改为属性 - 将获得不同的 IL 代码 - 您正在失去二进制兼容性。这可能会影响访问已更改类的其他程序集的序列化和重新编译代码。如果您在并非同时部署所有程序集的部分更新中部署应用程序,这将很糟糕。
另一方面,您可以使用支持字段或自动属性来实现属性,在这两种情况下您将获得相同的 IL 代码,这意味着您破坏某些东西的风险较小。