有没有关于使用结构体作为WCF服务的返回类型的官方建议?
我正在与一个我没写的服务进行互动,并发现自己的灵感来询问我的烦恼是否得到保证.
我以前总是使用类 – 可能部分是因为这是样本总是显示,但是现在我想到了,因为其他“直观”的原因:
>我通过定义一个单独的项目来开始合同样式,其中接口表示服务将来回传递的类型.
>我使用LINQ很多,所以对可空性的测试是隐式的引用类型,而使用结构和其他值类型,我总是需要标记为可空.
那些是一些我马上来找我,虽然我会承认它比我想象中的一个项目符号列表更直观.我想提出这个问题,因为我正在处理一个返回结构体并在处理返回值时必须写入的服务:
var foo = Bar.Value.MyField;
代替
var foo = Bar.Value;
解决方法
如果您可以创建一个结构体并放置一个[DataContract]属性,请继续使用!对于WCF,这没有什么不同–WCF只需要标记使用DataContract属性使用的类或结构体,并且要包含在序列化消息中的所有字段都要用[DataMember]属性标记.
如果您在DataContractAttribute上检查MSDN文档,则表明您可以在结构体上使用它:
[AttributeUsageAttribute(AttributeTargets.Class| AttributeTargets.Struct|AttributeTargets.Enum,Inherited = false,AllowMultiple = false)] public sealed class DataContractAttribute : Attribute
更新:关于什么时候使用一个struct而不是一个类(一般来说,在.NET中),请看这个SO问题:
When should I use a struct instead of a class?
然而,由于WCF实际上是关于消息传递(即您的客户端进行方法调用,该调用及其参数将被转换成串行消息,该消息通过线路发送,然后在另一端重新组合并转换为方法调用),我没有看到有任何令人信服的理由使用结构体.
一般.NET的所有优点并不适用于WCF的SOA世界,我会说(你不是传递类或结构实例 – 见上文).