English 中文(简体)
不是VB.NET
原标题:
  • 时间:2009-03-16 10:57:54
  •  标签:

我现在面临一个兴奋的任务,要了解VB.NET的<>Not运算符。通过我对它的少量使用,我认为Not的功能相当于C#中的!,而<>相当于!=

在VB.NET中,常见的问题是针对没有引用的对象执行布尔表达式。因此,如果我们这样做。

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

如果查询字符串不存在,则实际上会失败。为什么,我不知道。老一辈的程序员所采取的方式如下:

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

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

我问这个问题是因为我必须编写标准文档,并确定使用Not还是<>。您对哪种方式更好有什么想法,或者您应该这么做?

最佳回答

我一直都用以下内容:

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

但只是因为语法上读起来更好而已。

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

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

这些只是我一直使用的方法,除了在回顾代码时我觉得它们最合理外,我无法证明它们的使用。

问题回答

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

如果您正在使用v2的.Net Framework(或更高版本),则有IsNot运算符,可以正确地执行操作,并更自然地阅读。

我认为你的问题归结为“(Is=)的区别,以及(IsNot和<>)”。

在这两种情况下,答案是一样的:

=<>已经为值类型隐式定义,而你也可以为自己的类型显式定义它们。

IsIsNot是为比较引用类型而设计的,用于检查两个引用是否引用相同的对象。

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

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

Is 关键字检查两个运算对象是否引用了同一块对象内存,并且仅在这种情况下返回 true。我相信这在功能上等同于 Object.ReferenceEquals。而 IsNot 关键字只是简写语法,用于编写 Not ... Is ...,仅此而已。

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

当处理字符串时,除非你实际上要比较引用,否则总是使用=操作符(或String.Equals我想)。在你的情况下,因为你正在测试空值(Nothing),所以似乎需要使用IsIsNot关键字(等号运算符将失败,因为它不能比较空对象的值)。语法上,IsNot关键字在这里稍微好一些,所以就用它吧。

Just use which sounds better. I d use the first approach, though, because it seems to have fewer operations.

如果您需要知道变量是否存在,请使用Is / IsNot Nothing。

Using <> requires that the variable you re evaluating have the "<>" operator defined. Check out

 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 .   

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

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

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

in fact the Is is really good, since to the developpers, you may want to override the operator ==, to compare with the value. say you have a class A, operator == of A is to compare some of the field of A to the parameter. then you will be in trouble in c# to verify whether the object of A is null with following code,

    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 不期望有任何事情发生。





相关问题
热门标签