VB.NET中的'Null-Safe'Dot符号......还是以任何语言存在?使用LINQ'安全解除引用运算符'或等效运算符?

时间:2011-03-21 14:26:03

标签: vb.net linq syntax language-agnostic

我正在寻找VB.net中的'安全'点符号。在VB.NET或任何语言中是否存在这样的事情?我希望能够做的是,在使用不可空的旧版对象时,解决以下问题:

“如果有计划,如果有案例,如果有人,那个人的配偶,否则什么都没有(VBSpeak for Null)。”

并避免这样做:

Dim Spouse as Person = Nothing
if Case.Plan isnot nothing then
    if Case.Plan.Person isnot Nothing
        Spouse = Case.Plan.Person.Spouse
    end if
end if

并执行此操作:

Dim Spouse as Person = Case~Plan~Person~Spouse

'~'是我所寻求的'安全'点符号,它在遇到第一个空对象时立即返回null而不是抛出异常?

当然,这个问题更常见:

dim MyVar as string = XMLDoc.DocumentElement.SelectSingleNode("Name").InnerText

并且当Name不存在时,想要Nothing而不是异常。

编辑:

有没有办法使用 LINQ 表示对象或LINQ for XML来解决这个问题?

4 个答案:

答案 0 :(得分:2)

VB.NET 14引入了null-conditional运算符来解决这个问题。该操作员也在短路。

Dim Spouse as Person = Case?.Plan?.Person?.Spouse
  

用于在执行成员访问(?。)或索引(?[)操作之前测试null。这些运算符可以帮助您编写更少的代码来处理空值检查,尤其是降序到数据结构中。

答案 1 :(得分:1)

我通常使用扩展方法来处理这种事情,非常类似于AakashM指向的线程。一个很好的例子是字符串LENGTH。由于LENGTH函数是一个实例方法,如果你在一个空字符串对象上调用它,你就会抛出。

但是在测试null的字符串类上编译扩展方法LEN并且你可以让它返回0(我碰巧几乎一直在考虑空字符串0的长度,但这是另一个线程的主题。)

使用相同的逻辑,您可以实现IsNotNull,或者可能是IsValid。主要问题是“停止”持续的财产解决方案(例如,从案例到计划)

上面提到的线程上的方法使用Lambdas,如果你问我,它会产生一种相当笨拙的语法。我怀疑,如果IsNotNull测试产生一个null,则返回一个代表null的Proxy对象是可能的,并且只会将你对其进行的任何方法调用解析为null。但这需要一个动态代理,这本身就很混乱。

答案 2 :(得分:1)

在14之前的VB版本(Visual Studio 2015)中没有零安全点表示法。

处理可能的空值而没有太多ifs的更好方法是使用AndAlso(短路和):

If Case.Plan IsNot Nothing _
AndAlso Case.Plan.Person IsNot Nothing _
AndAlso Case.Plan.Person.Name = "Something" Then
    'Do something here
End If

另一种选择是使用Null Object Pattern。但这只适用于您自己的数据类型,并且需要对代码进行一些更改。

修改

要回答有关LINQ的问题,它无法帮助您解决此问题。 LINQ的目标是帮助您查询数据集(列表,数组等)。如果您尝试使用LINQ查询数据,如果您的某个对象为空,则会遇到同样的问题。

答案 3 :(得分:1)

对于VB.NET语法而言,它没有像C#那样的空合并运算符。运营商。 Iif()函数可以编写更紧凑的If语句,但它们很少用于空引用,因为两个参数都被计算。

通常,尝试将null引用作为调试辅助工具。当你没有编写的其他代码调用你的代码时,它们会抛出一个很好的异常,但会搞砸像初始化这样的东西。静默传播编程错误导致难以诊断失败。就像NullReferenceException一样远离原因。或者更坏,数据不好。您可以使用NotAPlan和NoSpouse对象来解决您的场景,这些对象仅存在以避免空引用异常,并且逻辑上意味着“没有分配计划,没有定义配偶”。可以为null的引用只不过是引用+布尔值。不要跳过布尔。