Lambda检查对象数组的null - ArgumentNullException

时间:2018-06-02 15:22:36

标签: vb.net

我正在尝试从BranchCode数组中获取UserBranches()字符串。对于特定用户,列表什么都不是,因此导致异常:

  

System.ArgumentNullException:'值不能为空。
  参数名称:source'

我正在使用IIF声明,但显然无效:

Dim sMatchedBranches = IIf(Not IsNothing(oUser.UserBranches),
                           oUser.UserBranches.Select(Function(z) String.Format("{0} - BranchCode", z.BranchCode)), "")

我也使用了oUser.UserBranches.Any,但仍然是同样的例外。有什么想法吗?

**对于重复的推荐,实际上并不是因为问题结合了IIF和带有lambda表达式的空数组。

1 个答案:

答案 0 :(得分:3)

首先,我要重申@TnTinMn所说的内容:尝试断绝Microsoft.VisualBasic。选择那里有用的东西是可以的 - 在这种情况下非常有思想和有意识(例如,甚至像输入框这样的C#'很多! - What is the C# version of VB.net's InputDialog?)。然而,VB今天有更多更好,更好的方法来完成任务。

你们IIf()的主要缺陷是它只是一些功能,这意味着无论条件如何,每个参数都会被执行。这使它几乎没用,即使在VB6 / VBA中也是如此,因为你无法避免任何你知道将在每个条件下发生的运行时错误/异常。另一方面,If()是一个真正的操作符,它可以提供每个人想要的内容 - 一种在不必编写专用函数的情况下仔细修剪在表达式中执行的内容的方法。

因此,简单的答案就是将IIf()替换为If()并完成相关操作:

Dim sMatchedBranches = If(Not IsNothing(oUser.UserBranches),
                       oUser.UserBranches.Select(Function(z) String.Format("{0} - BranchCode", z.BranchCode)), "")

有人可能觉得这已经够好了。但是VB中有三个其他技巧可以使事情变得更好。

第一个是?运算符。这是一种方便的方式来说If(oUser.UserBranches Is Nothing, Nothing, oUser.UserBranches.Select(Function(z) String.Format("{0} - BranchCode", z.BranchCode)))之类的内容,除了?它现在就像这样:

oUser.UserBranches?.Select(Function(z) String.Format("{0} - BranchCode", z.BranchCode))

第二个技巧是字符串插值,格式为$"{myVar}"。而不是String.Format("{0} - BranchCode", z.BranchCode),现在可以是:

$"{z.BranchCode} - BranchCode"

第三个技巧是关于If():如果给它两个参数,它将提供一种处理Nothing的非常方便的方法。 If(x,y)表示如果x不是Nothing,则返回x,否则返回y。 (If(x,y)表示与C#中的x ?? y相同。)

全部放在一起:

Dim sMatchedBranches = If(oUser.UserBranches?.Select(Function(z) $"{z.BranchCode} - BranchCode"), "")