代码之家  ›  专栏  ›  技术社区  ›  Llyle bonjorno

带case或ing的vb.net select case语句逻辑是什么?

  •  53
  • Llyle bonjorno  · 技术社区  · 15 年前

    我用的是 Or 在我的案例表达式中的语句。

    尽管我在这个范围内有一个值,但它找不到匹配项。为什么不呢?

    示例代码 :

    Select Case 2
        Case 0
            ' Some logic
    
        Case 1
            ' Some other logic
    
        Case 2 Or 3
            Console.WriteLine("hit")
    
     End Select
    

    根据上面的内容,我假设 hit 会被打印出来,但事实并非如此。

    5 回复  |  直到 9 年前
        1
  •  91
  •   JaredPar    15 年前

    使用逗号运算符分隔case语句

    Select Case 2
        Case 0,1,2,3
            Console.WriteLine("hit")
     End Select
    
        2
  •  23
  •   Peter Mortensen Mohit    9 年前

    AS 贾里德 也就是说,您需要使用逗号运算符来分隔case语句。

    这个 Or 您所做的是按位或,因此它是“3”。有趣的是,“2和3”可能适用于您的具体案例。

        3
  •  20
  •   Indeed is Trash    15 年前

    Jaredpar是正确的,但您也可以使用

    Select Case 2
        Case 0,1
        Case 2 To 3
            Console.WriteLine("Hit")
    End Select
    

    这将是0或1什么都不做,2或3打印命中…to构造是一个范围…

    Here's the MSDN

        4
  •  10
  •   user67143    15 年前

    编辑: 假设vb.net不允许使用case-oring,似乎我错了。我在想C和IL,似乎我错了。

    然而,正如有人指出的那样,您的代码不起作用的原因是案例2或3将2或3作为按位“或”进行了评估,因此对案例3进行了评估。

    澄清:

    
           2 binary = 0000 0010
           3 binary = 0000 0011
      2 Or 3 binary = 0000 0011 (= 3)
    
    
      Select Case 2
         Case 0            '--> no match
    
         Case 1            '--> no match
    
         Case 2 Or 3       '(equivalent to Case 3  --> no match)
       End Select
    

    然而,我觉得我应该指出,为了性能,不应该使用这样的构造。当编译器遇到select语句(在c中切换)时,它将尝试使用查找表和 转换 MSIL指令,但在这种情况下 1,2,11,55 编译器将无法将其转换为查找表,它必须使用一系列比较(就像使用if..否则)。

    要点是,为了真正利用select语句,设计案例时应该考虑到这一点。否则,唯一的好处就是代码可读性。

    设计良好的交换机是O(1)操作,而设计不良的交换机(相当于一系列if..then..else语句)是O(n)操作。

        5
  •  3
  •   achinda99    15 年前

    这将允许您在0的情况下执行“something”,在1的情况下执行“something”,在2或3的情况下执行“hit”,否则执行“hit else”。

    Select Case 2
        Case 0
            Console.WriteLine("something")
        Case 1
            Console.WriteLine("something else")
        Case Is 2 To 3
            Console.WriteLine("hit")
        Else
            Console.WriteLine("hit else")
     End Select