在VB.NET中如何使用“不包含”运算符?

25

我正在研究VB.NET中的<>Not运算符。 我假设根据自己的少量使用,Not是类似于C#等语言中的!操作符的功能等效项,而<>则相当于!=

在VB.NET中,常见问题是对没有引用的对象进行布尔表达式。因此,如果我们执行以下操作:

If Request.QueryString("MyQueryString") <> Nothing Then

如果查询字符串不存在,这实际上会失败。为什么我不知道。老一辈程序员的做法是这样的:

If Not Request.QueryString("MyQueryString") Is Nothing Then

这个经常起作用。对我来说,它们在功能上是等效的,尽管运算符根据某些因素进行不同的比较,例如运算符优先级,但为什么它在这种情况下不起作用,我不知道,也没有找到任何相关资料。

我问这个问题是因为我需要编写标准文档,并确定使用Not<>。有关哪种方式更合适的任何想法,或者你应该做什么?

9个回答

33

我一直使用以下代码:

If Request.QueryString("MyQueryString") IsNot Nothing Then

但只是因为在语法上更易读。

在测试有效的QueryString条目时,我还使用以下代码:

If Not String.IsNullOrEmpty(Request.QueryString("MyQueryString")) Then

这些只是我一直使用的方法,除了在阅读代码时它们对我来说最有意义之外,我无法证明它们的使用。


所以,为了澄清一下,这两者之间有什么区别?我想,"IsNot Nothing" 是用来检查空引用的,但后面的例子还检查了一个空值或 null 的 value,而不是引用? - Kieran Senior
非常好的回答,@Charles。几乎和我写的一模一样。+1 - Cerebrus
1
Kezzer - 第一个仅检查未填充的变量,例如null/nothing。它无法检测空字符串,我猜第二个是更完整的语句,并为您完成更多工作。 - Charlie

11

Is 不等同于 = -- Is 比较的是引用 (reference),而 = 比较的是值(value)。

如果你正在使用 .Net Framework 的 v2 版本或者更高版本,可以使用 IsNot 运算符,它会做正确的比较并且语义更加自然。


1
哦,糟糕了,这教会我不要假设相等语义 - 这意味着我在工作项目中只是把一个错误换成了另一个错误。我真希望我们使用版本控制... - user89335

10

我认为你的问题可以归结为“(Is=)以及(IsNot<>)之间的区别"。

对于这两种情况的答案是一样的:

=<>在值类型中有隐式定义,您可以为您的类型显式地定义它们。

IsIsNot是为了在引用类型之间进行比较并检查两个引用是否指向相同的对象。

在您的示例中,您正在将一个字符串对象与Nothing(Null)进行比较,并且由于=/<>操作符已经针对字符串进行了定义,因此第一个示例有效。然而,当遇到 Null 时,它将不起作用,因为字符串是引用类型并且可以为 Null。更好的方法(正如您猜测的那样)是使用后面的版本,即使用Is/IsNot


1

这是技术性的答案(扩展了 Rowland Shaw 的回答)。

Is 关键字检查两个操作数是否引用相同的对象内存,并且仅在此情况下返回 true。我相信它在功能上等同于 Object.ReferenceEquals。而 IsNot 关键字只是简写语法,用于编写 Not ... Is ...,没有其他含义。

=(相等)运算符比较值,在这种情况下(以及许多其他情况下)相当于 String.Equals。现在,<>(不相等)运算符并没有像 IsIsNot 关键字那样有完全类似的类比,因为它可以根据类单独覆盖 = 运算符。我认为情况应该始终如一地返回 = 运算符的逻辑反义(在 String 的情况下确实如此),并且只允许在测试不相等而不是相等时进行更有效的比较。

在处理字符串时,除非你确实想要比较引用,否则总是使用=运算符(或者我想说的是String.Equals)。在你的情况下,因为你正在测试null(Nothing),所以似乎需要使用IsIsNot关键字(等式运算符将失败,因为它无法比较null对象的值)。从语法上讲,在这里IsNot关键字更好一些,所以选择它。


0

实际上,Is非常好用,因为对于开发人员来说,你可能想要重写运算符==,以便与值进行比较。假设你有一个类A,A的运算符==是将A的某些字段与参数进行比较。然后在C#中,如果要验证A对象是否为空,你会遇到麻烦,使用以下代码:

    A a = new A();
...
    if (a != null)
it will totally wrong, you always need to use if((object)a != null)
but in vb.net you cannot write in this way, you always need to write
    if not a is nothing then
or
    if a isnot nothing then

正如Christian所说,vb.net什么也不“期望”。


0
如果您需要知道变量是否存在,请使用Is/IsNot Nothing。
使用<>要求您评估的变量定义了“<>”运算符。 请查看。
 Dim b As HttpContext
 If b <> Nothing Then
    ...
 End If

以及导致的错误

Error   1   Operator '<>' is not defined for types 'System.Web.HttpContext' and 'System.Web.HttpContext'.   

0

只需使用哪个听起来更好就行了。 不过,我会使用第一种方法,因为它似乎有较少的操作。


0
C#和VB.NET编译器经常为在两种语言中显然等效的操作生成不同的IL。恰好当你写stringvar == null时,C#会做“预期”的事情,但VB.NET则不会。要在VB.NET中获得相同的效果,您必须使用Is运算符强制进行真实引用相等性比较。

0

我是一个完全的新手,我来这里是为了弄清楚VB的“不等于”语法,所以我想把它放在这里,以防其他人需要:

<%If Not boolean_variable%>Do this if boolean_variable is false<%End If%>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接