C#中的属性

为什么我们能写

public int RetInt { get;set; } 

代替

 public int RetInt { get{return someInt;}set{someInt=value;} } 

两者有什么区别?

此function称为自动实现的属性,并随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; } 

对于你的问题

两者有什么区别?

在你的情况下,没有。 由于您在设置或检索值时没有做任何事情,但假设您想要进行一些validation或想要执行其他类型的检查,那么:

 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属性的情况下,它的支持字段可以被初始化/实例化而不是构造函数。

 private List list = new List(); public List List { get { return list; } set { list = value; } } 

如果是Auto实施的属性,

 public List SomeOtherList { get; set; } 

您只能在构造函数中初始化SomeOtherList ,而不能在Field级别执行此操作。

这两者有何不同?

至少有两点不同:

  1. 在普通属性中,您必须先定义一个字段(在您的情况下为someInt
  2. 在普通属性中,您可以set/get修饰符中设置断点 ,而在auto属性中则不能这样做。

换句话说:如果您需要“只是属性”,请使用自动属性,如果您需要对工作流程进行更多控制(在set上引发事件,调试,运行其他内容),请使用“普通”属性。

这些是自动实现的属性。 有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/bb384054.aspx 。

引入这些内容的基本原因是为了减少程序员创建像someInt这样的私有变量的开销,这些变量几乎没有用在属性中。

实际上这些并没有什么不同,在这两种情况下你都有一个与你的属性相对应的私有字段,但在第一种情况下它是由编译器生成并隐藏的。

如果您需要在课堂上经常使用该属性背后的变量,我认为最好以旧的方式声明您的属性(第二个),因为每次您访问它时,如果您这样做,这将调用getter“新方法。

如果您只需要在课外(或在大多数情况下)使用它,那么您可以采用“新”方式(第一个)