Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ';空安全';VB.NET中的点表示法。。。或者它存在于任何语言中';安全解引用运算符';或使用LINQ的同等产品?_C#_Vb.net_Linq_Syntax_Language Agnostic - Fatal编程技术网

C# ';空安全';VB.NET中的点表示法。。。或者它存在于任何语言中';安全解引用运算符';或使用LINQ的同等产品?

C# ';空安全';VB.NET中的点表示法。。。或者它存在于任何语言中';安全解引用运算符';或使用LINQ的同等产品?,c#,vb.net,linq,syntax,language-agnostic,C#,Vb.net,Linq,Syntax,Language Agnostic,我正在VB.net中寻找“安全”的点表示法。在VB.NET或任何语言中是否存在这样的东西?我希望能够做到的是,在使用不可为空的遗留对象时,解决以下问题: “如果有计划,如果有案例,如果有人,该人的配偶,否则,什么都没有(VBS表示无效)。” 并避免这样做: Dim Spouse as Person = Nothing if Case.Plan isnot nothing then if Case.Plan.Person isnot Nothing Spouse = Cas

我正在VB.net中寻找“安全”的点表示法。在VB.NET或任何语言中是否存在这样的东西?我希望能够做到的是,在使用不可为空的遗留对象时,解决以下问题:

“如果有计划,如果有案例,如果有人,该人的配偶,否则,什么都没有(VBS表示无效)。”

并避免这样做:

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对象时立即返回null,而不是引发异常

当然,这个问题更常见的是:

dim MyVar as string = XMLDoc.DocumentElement.SelectSingleNode("Name").InnerText
当名称不存在时,不需要任何东西而不是异常

编辑:
有没有一种方法可以使用对象的LINQ或XML的LINQ来解决这个问题?

我通常使用扩展方法来解决这类问题,这与AakashM所指的线程非常相似。字符串长度就是一个很好的例子。由于LENGTH函数是一个实例方法,如果在空字符串对象上调用它,将抛出

但是在字符串类上扩展一个扩展方法LEN,它测试NULL,并且可以让它返回0(我恰巧总是考虑空字符串0的长度,但这是另一个线程的主题)。 使用相同的逻辑,您可以实现IsNotNull,或者IsValid。主要问题是“阻止”持续的房地产处置(从案例到计划)


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

在14之前的VB版本中没有空安全点符号(Visual Studio 2015)

在没有太多ifs的情况下,处理可能的空值的更好方法是使用AndAlso(短路和:

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

编辑:


为了回答你关于LINQ的问题,它不能帮你解决这个问题。LINQ的目标是帮助您查询数据集(列表、数组等)。如果您尝试使用LINQ查询数据,如果其中一个对象为null,您也会遇到同样的问题。

对于VB.NET语法来说,这就是问题所在,它没有任何类似于null合并运算符(如C#s)的东西??操作人员Iif()函数可以编写更紧凑的If语句,但它们很少适用于空引用,因为这两个参数都是经过计算的

通常,尝试使用空引用作为调试辅助。当您没有编写的其他代码调用您的代码时,它们会抛出一个很好的异常,但会搞乱初始化之类的事情。悄无声息地传播编程错误会导致难以诊断的故障。就像一个远离原因的NullReferenceException。更糟糕的是,糟糕的数据。您也许可以使用NotAPlan和NoSpouse对象来解决您的场景,这些对象的存在只是为了避免空引用异常,逻辑上意味着“没有分配计划,没有定义配偶”。可以为null的引用只不过是一个引用+一个布尔值。不要跳过bool。

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

Dim配偶作为个人=案例?计划?个人?配偶
用于在执行成员访问(?)或索引(?[)操作之前测试空值。这些运算符可帮助您编写更少的代码来处理空值检查,尤其是在降级到数据结构时

同样的事情在C#中也适用:

个人配偶=案例?计划?个人?配偶;

如果不存在LINQ查询,我会满足于LINQ查询,但我比其他任何东西都更好奇。一些巨大的旧程序仍在等待从.Net2.0(不是我的选择:-)升级。对于较新的程序,我们尝试使用其他解决方案。另请参阅和其他搜索结果以获取“安全的取消引用运算符”@AakashM-啊“安全解除引用操作符”我知道有一个正确的名字,我的google fu不见了!完全同意。我使用Len、Mid、Left和所有旧的VB字符串函数,尽管它们是令人讨厌的基于1的,因为额外的保护代码或更糟糕的是字符串对象版本的bug的成本。它们还有其他不错的功能保护。对于
MsgBox(Mid(“,2,5))
来说,像string.substring那样抛出异常是“合适的”—不幸的是,在实际编程中您需要
“”
99%的时间是Mid返回的!!!是的,一个基数在.net中有点拖拉,因为其他的都是0个基数。不过,使用扩展方法,您可以根据自己的喜好将这些函数设置为0或1个基数。我希望有一种扩展方法可以覆盖实例方法。然后我可以覆盖.net长度method的工作方式更像我需要它的工作方式,但遗憾的是,这是不可能的。VB中也有一个空合并操作:带有2个参数的If运算符:但我认为如果有多个空检查,If或??运算符将毫无帮助。关于If运算符:它只存在于2008版和更新版本中。我应该澄清po在这里,我的两个问题的不幸答案都是否定和否定。答案在这里标记,因为我已经倾向于使用他3点中的上述2点来解决这个问题,并且,第3点提供了我的LINQ问题的答案(不幸的是“否”),作为一个LINQ n00b,我没有任何线索。
If Case.Plan IsNot Nothing _
AndAlso Case.Plan.Person IsNot Nothing _
AndAlso Case.Plan.Person.Name = "Something" Then
    'Do something here
End If