What is the difference between public int i and public int i {get; set;} (what is the difference between automatic property and a public member?)
Possible Duplicates:
c#: why have empty get set properties instead of using a public member variable?
C#: Public Fields versus Automatic Properties
我在代码中使用"自动"属性,我想知道两者的实际区别是什么此代码:
1 2 3 | public class foo{ public int i; } |
和
1 2 3 | public class foo{ public int i {get; set;} } |
我知道有区别,因为我使用的第三方错过了公共成员,但在添加
因为在那后面没有私人的场地,那场戏的背后是什么?
当使用自动属性时,编译器会生成一个私有字段。
When you declare a property as shown in the following example, the compiler creates a private, anonymous backing field that can only be accessed through the property's get and set accessors.
关于这两个示例之间的差异,第一个示例直接公开字段以进行操作。这被认为是不好的做法(认为信息隐藏、封装丢失)。
在第二个示例中,您必须使用getter和setter,并且可以围绕这些操作添加任何类型的验证和其他逻辑。
查看此日志:
If I have a field with no special behavior, should I write a"just in case" property (with trivial get/set), or should I expose a public field?
The reason that the library design guidelines suggest you write a property here is that it is important that libraries be easily versioned. If you put a property in there ahead of time, you can change the property implementation without requiring users to recompile their code.
第一个是一个字段,可以描述为pod。第二个是一个属性,允许派生类重载和隐藏,而第一个不是。第二个是一个很好的,因为编译器会悄悄地创建一个后备存储器。
这是自动属性,不是匿名属性。实际上,它有一个私有的支持字段,它只是由编译器自动生成的,在编译时不可用。如果您通过类似于Reflector的东西运行您的类(或者在运行时使用Reflection检查它),您将看到支持字段。
回答你的问题"有什么区别?"显而易见的答案是,一个是字段,而另一个是属性。使用自动属性的好处是,如果需要,它可以让您在以后灵活地移动到传统属性,而无需更改API。对于第三方代码能够"到达"一个而不是另一个,这是另一个开发人员最好回答的问题。也就是说,大多数API设计用于处理属性,而不是字段(因为传统的观点是您不公开声明类之外的字段)。如果第三方库反射性地扫描您的类,那么它可能只查找属性。
重要的是要记住:
1 2 3 4 5 6 7 | private string backingField; public string Data { get { return backingField; } set { backingField = value; } } |
和
1 | public string Data { get; set; } |
编译为基本相同的代码。唯一实质性的区别是支持字段的名称。