我在我的代码中使用"自动"属性,我想知道这段代码之间的实际区别是什么:
public class foo{
public int i;
}
Run Code Online (Sandbox Code Playgroud)
和
public class foo{
public int i {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
我知道存在差异,因为我使用的正常第三方错过了公众成员,但发现他们曾经添加过{get; set;}.
由于背后没有私人领域,幕后背后会发生什么?
使用自动属性时,编译器会生成私有字段.
当您声明属性时,如以下示例所示,编译器将创建一个私有的匿名支持字段,该字段只能通过属性的get和set访问器进行访问.
关于两个例子之间的区别 - 第一个例子直接暴露了该领域以进行操纵.这被认为是不好的做法(认为信息隐藏,丢失封装).
在第二个示例中,您必须使用getter和setter,并且可以围绕这些操作添加任何类型的验证和其他逻辑.
看到这篇博文:
如果我有一个没有特殊行为的字段,我应该写一个"以防万一"属性(使用普通的get/set),还是应该公开一个公共字段?
图书馆设计指南建议您在此处编写属性的原因是图书馆很容易被版本化.如果您提前在其中放置属性,则可以更改属性实现,而无需用户重新编译其代码.