我将以下数据成员定义为数据协定的一部分,该数据协定从WOB方法的客户端传递到服务器。此数据协定用于服务器端;客户端是第三方供应商,他们很可能甚至不使用WCF并且正在使用Java客户端等。这是一个SOAP服务。
[DataMember(Name = "PhoneType", IsRequired = false)]
public string PhoneType { get; set; }
我原以为设置IsRequired = false
时,这意味着您可以完全省略SOAP请求中的元素,而PhoneType的值默认为String.Empty
。但是,这没有发生。
我在使用lead.PhoneType.Equals(somestring)
时遇到异常,因为lead.PhoneType
是一个空引用。当然,最简单的方法是首先检查NULL,但为什么它首先是null?我发现如果您在SOAP请求中包含<ns:PhoneType />
,则lead.PhoneType
设置为String.Empty
,但如果您从请求中完全排除该元素,那么lead.PhoneType
是空值。不应该默认为String.Empty
吗?我是否误解了WCF如何处理未包含在请求中的可选数据成员?
答案 0 :(得分:1)
如果声明了字符串变量但未设置它,则它将为null而不是string.Empty。这就是语言运作的方式。
在.NET中,字符串是引用类型而不是值类型,因此没有默认值。如果没有默认值,则该值为null。这是应该的。