【问题标题】:Array null element HasValue construct数组空元素 HasValue 构造
【发布时间】:2013-09-07 19:55:20
【问题描述】:

我有一个调用 WCF 服务 API(GetActiveDevicesByDetailId) 的简单代码块,它提供单个数组作为响应。因为,我没有在客户端定义正确的类对象来接收响应,我正在使用 var 数据类型并获取响应的属性/成员(CustomerID)。 API 返回一个我们用于客户端处理的实体数组。因为,API 只返回单个元素,获取如下所述的值。此外,为了处理 null(理想情况下它不应该返回 null),我正在检查并返回 null(如果是)。

这个语句vm[0].CustomerId.HasValue在返回null时是否返回异常?我检查了这段代码是否有简单的可空整数。但是这个语句对 Arrays 有什么作用呢?

var vm = client.GetActiveDevicesByDetailId(DetailID); 
            if (vm[0].CustomerId.HasValue)
                return vm[0].CustomerId.Value;
            else
                return null;

通过使用 GetValueorDefault() 解决。

var vm = client.GetActiveDevicesByDetailId(DetailID); 
            if (vm[0] != null)
                return vm[0].CustomerId.GetValueOrDefault();                                    
            else
                return null;

对此有何看法?

【问题讨论】:

  • 你必须有正确的类对象定义并且使用var不会改变任何东西。
  • 不,这是现在的问题。我们对 API 的响应没有确切的定义。我编写的 if 检查将检查“v[0].CustomerId”是否具有值,如果 v[0] 本身为空并且它尝试访问其 CustomerId 列,var 数据类型是否固有地处理这种情况?或者我们得到一个 NPE ?
  • 您的项目如何引用该服务?如果是通过“添加服务引用”,那么返回对象的定义应该在那里。这是第三方网络服务吗?

标签: c# arrays wcf nullpointerexception


【解决方案1】:

声明:

vm[0].CustomerId.HasValue

不应该返回异常如果 vm[0] 不为空。您应该在检查 CustomerId 值之前检查这一点。

有很多资源可以解释数组的工作原理(例如Arrays C#),所以我不打算在这里解释。

【讨论】:

  • 我知道有很多资源。我的主要疑问是如果“vm[0]”为空,它甚至不会有 CustomerId 属性。在java中,那将是NPE。在 C# 中也一样吗?
  • var 在 C# 中,推断类型,即它仍然是强类型的。如果编译器无法匹配类型,那么您将不会在 vm[0] 上获得智能感知(我当然假设您是!)。它仍然有可用的 CustomerId 属性。
  • "不应该返回异常,前提是 vm[0] 不为空" - 所以是的,如果 vm[0] 为空,你会得到一个空引用异常。如果数组为空,你会得到一个数组索引越界异常。这就是为什么@Damon 建议您检查vm[0] 是否为空。
  • 是的,谢谢,我通过检查不为空并使用 GetValueOrDefault() 来解决这个问题。我希望代码现在也不会因为空值而中断?
  • 阅读文档 (msdn.microsoft.com/en-us/library/72cec0e0.aspx) - “检索当前 Nullable 对象的值,或对象的默认值。”。注意HasValueGetValueOrDefaultnullable 类型的方法——你可以在int 上使用它们。如果你的数组为空,你仍然会抛出异常。
猜你喜欢
  • 1970-01-01
  • 2015-01-11
  • 1970-01-01
  • 2021-11-19
  • 2015-01-12
  • 1970-01-01
  • 1970-01-01
  • 2016-08-30
  • 2019-07-21
相关资源
最近更新 更多