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级别执行此操作。
这两者有何不同?
至少有两点不同:
- 在普通属性中,您必须先定义一个字段(在您的情况下为
someInt
) - 在普通属性中,您可以在
set/get
修饰符中设置断点 ,而在auto属性中则不能这样做。
换句话说:如果您需要“只是属性”,请使用自动属性,如果您需要对工作流程进行更多控制(在set
上引发事件,调试,运行其他内容),请使用“普通”属性。
这些是自动实现的属性。 有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/bb384054.aspx 。
引入这些内容的基本原因是为了减少程序员创建像someInt
这样的私有变量的开销,这些变量几乎没有用在属性中。
实际上这些并没有什么不同,在这两种情况下你都有一个与你的属性相对应的私有字段,但在第一种情况下它是由编译器生成并隐藏的。
如果您需要在课堂上经常使用该属性背后的变量,我认为最好以旧的方式声明您的属性(第二个),因为每次您访问它时,如果您这样做,这将调用getter“新方法。
如果您只需要在课外(或在大多数情况下)使用它,那么您可以采用“新”方式(第一个)