至少有一个明确的情况,您不应该使用自动实现的属性:两个不同DLL之间的任何类型的二进制序列化。
二进制序列化依赖于私有成员,并且自动实现的属性的私有支持成员不能保证在每个已编译的DLL中相同,因此二进制序列化可能会非常糟糕。
不使用自动实现的属性的另一个原因是,您将失去控制权,是指定支持字段为NonSerialized的能力,但在此情况下,为属性创建支持字段已足够简单。
如果您或您使用的任何产品在成员(即WCF)上执行了反射,则会看到损坏的支持字段名称,而不是您创建的“漂亮”支持字段。
如果您之前提供了对服务的访问权限,或者如果您在接收端反序列化为相同的类结构(即在WCF管道的两端使用相同的类),这可能非常重要。在这种情况下,您不一定能够反序列化,因为您可以保证支持字段名称是相同的,除非您共享相同的DLL而不是源代码。
例如,假设您有一项服务通过WCF将您的一些业务对象公开给您已创建的Silverlight客户端。为了重用您的业务逻辑,您的Silverlight客户端会添加对业务对象源代码的引用。如果您有自动实现的属性,则无法控制后备字段名称。由于WCF序列化成员而不是属性,因此无法确定从WCF服务传输到Silverlight的对象是否会正确反序列化,因为支持字段名称几乎肯定会不匹配。
我可以认为拥有第二种风格的一个原因是,当你想首先初始化_myValue并在ctor中使用默认值时。其他方面,我没有找到有这种风格的其他原因。 – Zenwalker 2012-01-10 02:20:21
StackOverflow不是讨论这些事情的地方。网上有很多资源,你可以从中得到答案。例如:http://msdn.microsoft.com/en-us/library/bb384054.aspx – evasilchenko 2012-01-10 02:20:25
任何时候您需要直接控制存储的值(想法验证),或者需要从内部私下访问该值你的类本身(即使考虑在get或set方法中使用不同的访问修饰符),你需要自己实现这个属性。否则,我倾向于使用自动属性功能来保存几行代码。 – 2012-01-10 02:23:21