24

我有一项令人兴奋的任务是了解 VB.NET<>Not运算符。 Not- 我假设通过我的少量使用它 - 在功能上等同!于 C# 等语言并且<>等同于!=.

在 VB.NET 中,一个常见的问题是对没有引用的对象执行布尔表达式,它出现了。所以如果我们这样做

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

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

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

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

我问这个是因为我必须编写标准文档,并且我们正在确定使用Not<>. 关于应该采用哪种方式的任何想法,或者您应该这样做?

4

9 回答 9

33

我一直使用以下内容:

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

但这只是因为在语法上它读起来更好。

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

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

这些只是我一直使用的方法,所以我无法证明它们的使用是合理的,除非它们在读回代码时对我来说最有意义。

于 2009-03-16T11:03:28.607 回答
11

Is=--Is比较引用不同,而=将比较值。

如果您使用的是 .Net Framework(或更高版本)的 v2,则IsNot操作员会做正确的事情,并且阅读起来更自然。

于 2009-03-16T11:05:50.877 回答
10

我认为您的问题归结为“(Is=)与(IsNot和<>)之间的区别”。

两种情况的答案都是一样的:

=并且<>为值类型隐式定义,您可以为您的类型显式定义它们。

Is并且IsNot设计用于在引用类型之间进行比较,以检查两个引用是否引用同一个对象。

在您的示例中,您将字符串对象与 Nothing (Null) 进行比较,并且由于=/<>运算符是为字符串定义的,因此第一个示例有效。但是,遇到 Null 时它不起作用,因为字符串是引用类型并且可以是 Null。更好的方法(如您所料)是使用Is/的后一个版本IsNot

于 2009-03-16T11:25:46.133 回答
1

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

Is关键字检查两个操作数是否是对同一个对象内存的引用,并且只有在这种情况下才返回 true。我相信它在功能上等同于Object.ReferenceEqualsIsNot关键字只是写作的简写语法,仅此Not ... Is ...而已。

= (相等)运算符比较值,在这种情况下(与许多其他情况一样)等效于String.Equals。现在,<> (不等式)运算符与IsIsNot关键字的类比并不完全相同,因为它可以根据类与=运算符分开覆盖。我相信这种情况应该始终是它返回=运算符的逻辑逆(当然在 String 的情况下),并且只允许在测试不等式而不是相等性时进行更有效的比较。

处理字符串时,除非您实际上是要比较引用,否则请始终使用=运算符(或我想是 String.Equals)。在您的情况下,因为您正在测试 null (Nothing),所以您似乎需要使用IsIsNot关键字(相等运算符将失败,因为它无法比较 null 对象的值)。从语法上讲,IsNot关键字在这里要好一些,所以就这样吧。

于 2009-03-16T11:29:36.903 回答
0

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

于 2009-03-16T11:21:07.267 回答
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'.   
于 2009-03-16T11:42:07.357 回答
0

C# 和 VB.NET 编译器通常会为两种语言中显然等效的操作生成不同的 IL。碰巧 C# 在您编写时会执行“预期”的事情stringvar == null,但 VB.NET 不会。要在 VB.NET 中获得相同的效果,您必须强制使用Is运算符进行真正的引用相等。

于 2009-07-28T12:36:05.607 回答
0

我是个菜鸟,我来这里是为了弄清楚 VB 的“不等于”语法,所以我想我会把它扔在这里以防其他人需要它:

<%If Not boolean_variable%>Do this if boolean_variable is false<%End If%>
于 2013-04-01T14:25:13.577 回答
0

实际上 Is 非常好,因为对于开发人员来说,您可能想要覆盖运算符 ==,以与值进行比较。假设你有一个类A,A的operator ==就是将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

正如克里斯蒂安所说,vb.net 并没有“预期”任何事情。

于 2013-06-22T14:45:44.640 回答