为什么我们可以写作
public int RetInt
{
get;set;
}
代替
public int RetInt
{
get{return someInt;}set{someInt=value;}
}
两者有什么区别?
为什么我们可以写作
public int RetInt
{
get;set;
}
代替
public int RetInt
{
get{return someInt;}set{someInt=value;}
}
两者有什么区别?
此功能称为自动实现的属性,并在 C# 3.0 中引入
在 C# 3.0 及更高版本中,当属性访问器中不需要额外的逻辑时,自动实现的属性使属性声明更加简洁。它们还使客户端代码能够创建对象。当您如下例所示声明属性时,编译器会创建一个私有的匿名支持字段,该字段只能通过属性的 get 和 set 访问器访问。
class Customer
{
// Auto-Impl Properties for trivial get and set
public double TotalPurchases { get; set; }
public string Name { get; set; }
public int CustomerID { get; set; }
对于你的问题
两者有什么区别?
在你的情况下,没有。由于您在设置或检索值时没有做任何事情,但假设您想要进行一些验证或想要执行其他类型的检查:
private int someInt;
public int RetInt
{
get
{
if (someInt > 0)
return someInt;
else
return -1;
}
set { someInt = value; } // same kind of check /validation can be done here
}
以上无法使用自动实现的属性来完成。
您可以看到差异的另一件事是在初始化自定义类类型属性时。
如果MyClass
在 Normal 属性的情况下您有 Then 列表,则可以初始化/实例化其支持字段而不是构造函数。
private List<MyClass> list = new List<MyClass>();
public List<MyClass> List
{
get { return list; }
set { list = value; }
}
如果是 Auto 实现的属性,
public List<MyClass> SomeOtherList { get; set; }
您只能SomeOtherList
在构造函数中初始化,不能在字段级别进行初始化。
这两个有什么不同?
至少有两点不同:
someInt
在您的情况下)set/get
,而在自动属性中则不能这样做。换句话说:如果您需要“仅属性”,请使用自动属性,如果您需要对工作流程进行更多控制(在 上引发事件set
、调试、在内部运行其他内容),请使用“正常”属性。
这些是自动实现的属性。请参阅http://msdn.microsoft.com/en-us/library/bb384054.aspx了解更多信息。
引入这些的基本原因是为了减少程序员创建私有变量的开销,比如someInt
在属性中使用它几乎没有用处。
实际上,这些并没有真正的不同,在这两种情况下,您都有一个与您的属性相对应的私有字段,但在第一种情况下,它是由编译器生成并隐藏的。
如果您需要在您的类中经常使用属性后面的变量,我认为最好以旧方式(第二个)声明您的属性,因为每次您访问它时,如果您这样做,这将调用 getter “新方法。
如果您只需要在课堂外使用它(或在大多数情况下),那么您可以采用“新”方式(第一种)