2010-05-25 25 views
10
  1. 有人可以解释我使用自动实现的属性c#背后的想法是什么?自动执行的属性c#

    public class Customer 
    { 
        public int ID { get; set; } 
        public string Name { get; set; } 
    } 
    

    我得到了使用私人领域属性的动机,因此我们可以确定如何访问私人领域。但是在这里 - 就像定义该领域从第一位开始公开一样。没有?

  2. 将字段定义为“公共常量”还是将其定义为具有只读属性之间有区别吗?

+1

[c#:可能有重复的纯粹公共属性](http://stackoverflow.com/questions/2901591/c-what-is-the-point-in-having-a-purely - 公有财产) – 2010-05-25 09:08:58

+0

和http://stackoverflow.com/questions/1277572,http://stackoverflow.com/questions/1272521,http://stackoverflow.com/questions/1180860和更多 – 2010-05-25 09:21:33

+0

可能重复的[在C#3.0 +中的属性和字段的区别](http://stackoverflow.com/questions/653536/difference-between-property-and-field-in-c-sharp-3-0) – nawfal 2013-06-03 18:28:29

回答

16

公共自动属性与公共字段不同,它们不是二进制兼容的。如果你实现一个公共领域,并且稍后想要添加一些逻辑,则必须将其更改为一个属性,从而引入重大更改(由于二进制不兼容)。这就是为什么许多惯例声明你不应该公开领域而是使用属性。

所以,对于任何简单的非私有类值成员来说,自动属性只是一个方便的起点,允许在稍后添加逻辑的同时保持二进制兼容性。

5

属性可以是数据绑定,而字段不能。

+0

我想,这是他们被发明的唯一真正原因...... – SergeyT 2015-07-23 14:04:02

2

我会让MSDN在这里做的说话....

“在C#3.0及更高版本,自动实现的属性使属性声明更简洁当属性访问器不需要额外的逻辑。他们当你声明一个属性如下面的例子(例如见MSDN文章),所示时,编译器创建一个私人的匿名支持字段,只能通过属性的get和set访问器来访问“

可能是最有利的二fference是你可以做前/后验证,提高PropertyChanged事件等

定义一个字段为“公共常量”或定义它具有只读属性之间有区别吗?

是的,只读字段必须有专用字段声明。该字段可以在内部由类更改,将字段标记为常量意味着它不能修改

1

2:一个公共常量必须在编译时定义,您不能使用引用对象。只有从System.ValueType继承的类(字符串,整数,双,...)

一个const也是静态的,而只有一个获取方法的属性是不是(每个类都有它自己的实例。)

3

自动实现的属性本质上是语法糖。一旦编译完成,后备存储就存在。它只是不可用的源代码。

正如其他人所说,属性和字段是不相同的。字段和属性不兼容,因此它们之间的变化是一个突破性变化。另外,您不能使用与字段的数据绑定。

最后一点。虽然在你的案例中,这个例子和公共领域之间的功能差别很小,但你可以改变其中一个访问者的可见性。所以,要创建使用自动属性只读属性,你可以这样做:

public int ID { get; private set; } 

在这种情况下,get访问是公共的,按照整个签名,但set访问是私人的。