c# – 使用自动实现的属性或自己实现属性

在C#中,我们可以创建一个自动实现的属性

public string MyValue{get;set;}

但是,我们也可以自己创建一个属性

private string _myValue;
public string MyValue
{
    get { retrun _myValue; }
    set { _myValue = value; }
}

我的问题是在哪种情况下我们应该使用auto one以及我们应该自己实施哪种情况?

最佳答案
至少有一个明显的案例,你不应该使用自动实现的属性:两个不同的DLL之间的任何类型的二进制序列化.

二进制序列化依赖于私有成员,并且自动实现的属性的私有后备成员在每个编译的DLL中都不保证是相同的,因此二进制序列化可能会非常糟糕.

不使用自动实现的属性的另一个原因是您将失去控制能力将支持字段指定为NonSerialized,但在这种情况下,很容易为属性创建支持字段.

如果您或您使用的任何产品对成员(即WCF)执行反射,那么您将看到损坏的支持字段名称,而不是您创建的“漂亮”支持字段.

如果您之前提供了对服务的访问权限,或者您将接收端的反序列化为相同的类结构(即在WCF管道的两端使用相同的类),则这可能非常重要.在这种情况下,您不一定能够反序列化,因为您可以保证支持字段名称相同,除非您共享相同的DLL而不是源代码.

例如,假设您有一个服务通过WCF将您的一些业务对象公开给您创建的Silverlight客户端.为了重用您的业务逻辑,您的Silverlight客户端会添加对业务对象的源代码的引用.如果您具有自动实现的属性,则无法控制支持字段名称.由于WCF序列化成员而不是属性,因此您无法确定从WCF服务转移到silverlight的对象是否会正确反序列化,因为支持字段名称几乎肯定会不匹配.

转载注明原文:c# – 使用自动实现的属性或自己实现属性 - 代码日志