字符串<> Nothing And String<> ""在VB .NET中冗余?

时间:2012-07-02 02:26:21

标签: vb.net

我看了一些代码并发现了这个:

Dim TestString As String
...
If TestString <> Nothing And TestString <> "" Then
...
EndIf

两个条件都检查相同的事情吗?谢谢

3 个答案:

答案 0 :(得分:14)

Nothing根本就没有字符串(null在其他语言中),这与空字符串("")不同,后者实际上是一个字符串。

但是,检查应该替换为If Not String.IsNullOrEmpty(TestString) Then,这样可以更清楚地了解您正在做什么。

我刚刚在LINQPad中玩了一些,发现了一些令人费解的东西。在VB.NET中:

Dim s1 as string = Nothing
Dim s2 as string = ""

Console.WriteLine(s1 is Nothing) 'True
Console.WriteLine(s2 is Nothing) 'False

Console.WriteLine(s1 = "") 'True
Console.WriteLine(s2 = "") 'True

Console.WriteLine(string.IsNullOrEmpty(s1)) 'True
Console.WriteLine(string.IsNullOrEmpty(s2)) 'True

在C#中:

string s1 = null;
string s2 = "";

Console.WriteLine(s1 == null); //True
Console.WriteLine(s2 == null); //False

Console.WriteLine(s1 == ""); //False
Console.WriteLine(s2 == ""); //True

Console.WriteLine(string.IsNullOrEmpty(s1)); //True
Console.WriteLine(string.IsNullOrEmpty(s2)); //True

我并不是那么期待。似乎VB.Net将Nothing视为空字符串。我的猜测是与旧版本的VB兼容。

这进一步加强了你应该使用String.IsNullOrEmpty进行这些检查,因为它更明确你要检查的内容,并按预期工作。

答案 1 :(得分:7)

他们正在检查同样的东西,但他们可能意味着来检查不同的东西。

If IsNothing(TestString) Then

并且

If TestString = Nothing Then

是不同的测试 - 第一种很少使用,因为通常你只是想知道它是否具有非空值。但它可用于在DB中以不同的方式处理空字符串和空值,或用于检测可选参数的使用(两种情况都需要额外的工作以确保您不会无意中滑入错误的值,所以有些脆弱)。

在给出的示例中,测试实际上有点罗嗦和令人困惑,如果这是您想要测试的那么     如果String.IsNullOrEmpty(TestString)那么

是否可以解决这个问题。如果“和”应该是“或”那么使用IsNothing(TestString)可能是有意义的。

答案 2 :(得分:3)

是的,根据VB.NET中的定义""相当于Nothing,包括=<>和所有 VB 函数;除非您明确关心差异,例如选中Is

当然,在使用常规.NET函数时,尤其是str.Method将因Null引用异常而失败的方法时,您会看到差异。

顺便说一句,我猜想OP中的摘录是C#代码(严重)转换。