我知道这可能是一个愚蠢的问题。我提到了一些文章。但是,我很有兴趣知道以下代码的主要区别,
using System;
namespace Business
{
public class User
{
private int _id;
public int ID
{
get { return _id; }
set { _id = value; }
}
}
}
和
using System;
namespace Business
{
public class User
{
public int ID { get; set; }
}
}
我想知道一些简短的细节(任何参考资料)......
由于
答案 0 :(得分:2)
在你的例子中没有区别。
但是,封装是面向对象编程的一个重要方面。你通常不希望有一个开放的setter。
namespace Business
{
public class User
{
private int _id;
public int ID
{
get { return _id; }
set {
if (value <= 0)
throw new ArgumentOutOfRangeException(value, "value", "Impossible value");
_id = value; }
}
}
}
通过使用支持字段,您还可以确保在构造函数中指定了值:
namespace Business
{
public class User
{
private AccountState _state;
public User()
{
_state = AccountState.Active;
}
public AccountState State
{
get { return _state; }
set {
if (value == AccountState.Active && PasswordExpired)
throw new ArgumentException("Can not set active state when the password have expired");
_state = value;
}
}
}
}
答案 1 :(得分:1)
编译器没有任何区别,但代码存在差异。
您无法在自动属性上拦截set
和get
,您可以在正常情况下执行此操作。如果您曾经使用过WPF,那么您会发现大量使用这种“普通”属性。
public int Data {
get {}
set {
//Do something ehere
}
}
这意味着您无法调试它们(自动属性)或将断点放入其中。
答案 2 :(得分:0)
编译后它们是相同的。
public int ID { get; set; }
只是&#34;语法糖&#34;。
这称为&#34; auto properties&#34;如果你有&#34;空的getter / setter&#34;并且非常有用的减少锅炉板代码。就像你的例子一样。
使用auto-property,您无法再直接访问后备字段,因为它仅在编译后才存在,如果JIT没有内联getter / setter,这可能会导致非常小的性能缺陷。
目前还没有办法直接初始化自动属性,但是对于即将推出的C#6,您可以执行以下操作:
public int ID { get; set; } = 0;
答案 3 :(得分:0)
自动实施的属性(http://msdn.microsoft.com/en-us/library/bb384054.aspx) 在C#3.0中引入,之前你必须使用你的第一个版本。
答案 4 :(得分:0)
引入了自动实现的属性以促进和简化:
private int _id;
public int ID
{
get { return _id; }
set { _id = value; }
}
进入这个:
public int ID { get; set; }
从编译器的角度来看,这两段代码是相同的。
但是,如果您想在属性中引入任何逻辑,那么自动实现的属性不是可行的方法。
例如,如果要验证id
的提供值必须始终为非负值,则可以在setter中实现此逻辑,如下所示:
private int _id;
public int ID
{
get
{
return _id;
}
set
{
if (value < 0)
{
throw new BusinessException("You must provide a non-negative number for ID.");
}
_id = value;
}
}
使用自动实现的属性无法实现这种灵活性。