在 C# 中,我们可以创建一个自动实现的属性,如下所示
public string MyValue{get;set;}
然而,我们也可以像这样自己创建一个属性
private string _myValue;
public string MyValue
{
get { retrun _myValue; }
set { _myValue = value; }
}
我的问题是,在什么情况下我们应该使用自动一,什么情况下我们应该自己实现?
至少在一种明显的情况下,您不应使用自动实现的属性:两个不同 DLL 之间的任何类型的二进制序列化。
二进制序列化依赖于私有成员,并且自动实现属性的私有支持成员不能保证在每个编译的 DLL 中都相同,因此二进制序列化可能会严重失败。
不使用自动实现的属性的另一个原因是,您将失去对将支持字段指定为 NonSerialized 的能力的控制,但在这种情况下,为属性创建支持字段很容易。
如果您或您使用的任何产品对成员(即 WCF)执行反射,那么您将看到损坏的支持字段名称,而不是您创建的“漂亮”支持字段。
如果您之前提供了对服务的访问权限,或者您在接收端反序列化为相同的类结构(即,WCF 管道的两端使用相同的类),那么这一点可能非常重要。在这种情况下,您不一定能够反序列化,因为您可以保证支持字段名称相同,除非您共享相同的 DLL 而不是源代码。
例如,假设您有一项服务通过 WCF 将某些业务对象公开给您创建的 silverlight 客户端。为了重用您的业务逻辑,您的 Silverlight 客户端添加对业务对象源代码的引用。如果您有自动实现的属性,则您无法控制支持字段名称。由于 WCF 序列化的是成员而不是属性,因此您无法确定从 WCF 服务传输到 silverlight 的对象是否会正确反序列化,因为支持字段名称几乎肯定会不匹配。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)