【问题标题】:Select Case Fall through with Not Condition in VB.NET在 VB.NET 中使用 Not Condition 选择 Case Fall through
【发布时间】:2011-07-21 03:04:44
【问题描述】:

如何在以下选择案例中添加 Not 条件。

Is 适用于单个值,而“To”适用于 Range,但该值是特定值,没有数字序列。在这种情况下是否可以使用选择案例,或者我是否必须切换到 if-else。例如:我不想在值为 0 和 3 时执行 case

           Select value
             case 0,1,2,3
           End Select

【问题讨论】:

    标签: vb.net switch-statement conditional-statements select-case


    【解决方案1】:

    我不确定我是否理解这个问题......

    你为什么不能像这样写示例代码:

    Select Case value
        Case 1, 2
            DoWork()
    End Select
    

    value = 0value = 3 时不会执行任何操作。提供给Case 语句的一系列值不必是连续的。


    根据评论更新:

    我会这样写,利用Case Else 标签:

    Select Case myComboBox.SelectedIndex
        Case 1, 5, 8
            'The suggestion is acceptable, so process it
            DoWork()
        Case Else
            'The suggestion is invalid, so show an error
            MessageBox.Show("You cannot select that option. " & _
                            "Please choose options 1, 5, or 8 instead.", _
                            "Invalid Selection", _
                            MessageBoxButtons.OK, MessageBoxIcon.Error)
    End Select
    

    当然,如果在用户选择 正确 值的情况下您实际上没有任何“工作”要做,那么在全部。基本规则应该是使用使您的代码最清晰和最容易理解的那个。 Select CaseIf 语句更快的怀疑几乎没有道理——编译器足够聪明,几乎可以在每种情况下产生几乎相同的结果。

    【讨论】:

    • 让我们说 1,2,3,4...n 不仅仅是值而且它们有意义可以说它们是下拉/组合框列表中的 ID,用户选择一个价值。假设用户只能在 1、5、8 时选择,否则显示消息。你怎么把它放在一个单独的case语句中?
    • @user:我用另一个代码示例更新了我的答案。这有帮助吗?
    • 我也想过这个问题,但只是想知道它是否可以在单例语句中完成。像 If Not (1,5,8) 然后 showMessagebox() 。而不是 If (1,5,8) DoWork() Else ShowMessagebox()。
    • @user:不,你不能那样做。而且也绝对没有理由这样做。 VB.NET 是唯一支持Case 1, 2, 3 语法的语言。你甚至不能用 C# 编写它。你需要If (i = 1) OrElse (i = 5) OrElse (i = 8) Then。你认为这到底是什么?
    • 只是想知道这是否可能。
    【解决方案2】:

    基于 Cody 写的我会选择:

    Select Case value
        Case 1, 2
            DoWork()
        Case 0 ,3               
            'nothing to do, only log if needed
        Case Else
            Debug.Fail("Please provide a logical path for all possible values")
    End Select
    

    额外的分支只是为了阐明代码的意图并防止将来发生变化。

    【讨论】:

      【解决方案3】:

      我经常将 SELECT/CASE 与 IF/END IF 结合使用。第一个捕捉范围,然后第二个对范围做类似的事情,但可能有细微的差别。

          Dim Result As Integer = 1
          Select Case Result
              Case 0 To 3
                  SaveOrder()
                  '0 to 3 is success 
                  If Result <> 0 AndAlso Result <> 3 Then
                      '1 and 2 = Everything ok
                      SendCustomerMesage(0)
                  Else
                      '0 and 3 = Order OK, but no stock in storage
                      SendCustomerMesage(1)
                  End If
      
              Case 4 To 8
                  '4 to 8 is error 
                  InformCustomer(value)
              Case Else
                  HandleError(value)
          End Select
      

      【讨论】:

      • 一个合理的例子,当然,请原谅我的吹毛求疵。但真正想到的问题是为什么要使用返回值来指示错误。除非这真的是低级代码,否则异常可能是更好的选择。即使你确实返回错误代码,为了可读性,一定要使用枚举。
      • @Cody 这只是我为这个答案编写的示例代码,而不是生产代码。 ;)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-20
      • 2013-06-25
      • 1970-01-01
      • 1970-01-01
      • 2014-02-14
      • 1970-01-01
      • 2021-05-18
      相关资源
      最近更新 更多