6

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

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

这两个条件检查同一件事吗?

谢谢

4

3 回答 3

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 将 aNothing视为空字符串。我的猜测是为了与旧版本的 VB 兼容。

这更加强化了您应该String.IsNullOrEmpty用于这些类型的检查,因为它更明确您正在检查的内容,并且按预期工作。

于 2012-07-02T02:30:07.607 回答
7

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

If IsNothing(TestString) Then

If TestString = Nothing Then

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

在给出的示例中,测试实际上有点冗长和混乱,如果这是您想要测试的内容,那么 If String.IsNullOrEmpty(TestString) Then

是解决它的方法。如果那个“and”应该是一个“or”,那么使用 IsNothing(TestString) 可能是有意义的。

于 2012-07-02T08:27:37.207 回答
3

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

当然,在使用一般 .NET 函数时,您会看到不同之处,尤其是那些str.Method会因 Null 引用异常而失败的方法。

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

于 2012-07-02T05:12:56.253 回答