【问题标题】:Case Statement Question -- vb.net案例陈述问题——vb.net
【发布时间】:2010-10-06 13:23:39
【问题描述】:

所以我在这里将案例陈述组合在一起,但我有一些案例陈述需要在确认原始案例后基于第二个变量进行额外决策。

这就是我现在拥有的:

Case "PRIVATE_PARTY"
    If Condition = KBB_CONDITION_EXCELLENT Then
        Vehicle.MarketValue = Response.PrivatePartyExcellent
    ElseIf Condition = KBB_CONDITION_GOOD Then
        Vehicle.MarketValue = Response.PrivatePartyGood
    Else
        Vehicle.MarketValue = Response.PrivatePartyFair
    End If

是否可以在这样的某些情况下添加“与”语句并让代码以相同的方式工作?

Case "TRADE_IN" And Condition = KBB_CONDITION_EXCELLENT
    Vehicle.MarketValue = Response.TradeInExcellent

然后只有 3 个 case 语句而不是 1 个,但代码看起来并不难看。顺便说一句,Condition 被声明为相同的选择。

  1. 这行得通吗?
  2. 如果它确实有效,我有什么理由不使用它吗?

【问题讨论】:

  • 只是好奇,您输入这个问题所花费的时间难道不是比在代码本身中进行这种微不足道的更改所需的时间更长,您可以自己查看它是否已编译?跨度>
  • @tnyfst:“它是否已编译”不是正确的问题,但应该是“它是否工作”。
  • 我也想从设计的角度了解一下。

标签: vb.net select case


【解决方案1】:

简答

代码可能会编译,但会错误。不要尝试像这样使用Select Case!我在下面解释原因。


长答案

Select Case在VB.NET中基本上是一个美化的If/ElseIf/等。 (它在语义上switch 相同)。因此,与使用 IfElseIf 等编写等效代码相比,尝试以这种方式编写代码实际上并没有真正的好处。

也就是说,下面使用 VB 9 编译 Option Strict OffOption Infer On

注意:我不是说这会“工作”只是因为它编译。我在这里提出的观点是,仅仅因为代码可以编译,并不意味着它会按照您的期望进行。再次:编译,但它不会工作。不要使用它。*

Select Case s
    Case "Private Party" AndAlso i = 1
        Console.WriteLine(1)
    Case "Trade In" AndAlso i = 2
        Console.WriteLine(2)
End Select

问题是:它把编译成什么

在 Reflector 中破解打开代码,你会看到:

Dim VB$t_string$L0 As String = s
If (VB$t_string$L0 = Conversions.ToString((Conversions.ToBoolean("Private Party") AndAlso (i = 1)))) Then
    Console.WriteLine(1)
ElseIf (VB$t_string$L0 = Conversions.ToString((Conversions.ToBoolean("Trade In") AndAlso (i = 2)))) Then
    Console.WriteLine(2)
End If

因此,VB 编译器将"Private Party" AndAlso i = 1 解释为Boolean,然后将其转换为String(“真”或“假”),以便与s 进行比较。

换句话说,这不会按您希望的方式工作。老实说,我会选择If/ElseIf 块;它会更容易阅读(在我看来)。

*你可能已经明白我的意思了;我只是想让它 100% 清楚;)

【讨论】:

  • 严格关闭选项并不是很好
  • @GôTô:哈哈,没人说它“很棒”。我强烈推荐反对它。但是,无论好坏,很多 VB.NET 开发人员(根据我的经验)在编写代码时使用 Option Strict Off。这样的开发人员可以编写我发布的 sn-p,看到它编译,然后拍拍自己的背。我想弄清楚这种行为是什么。
  • @GôTô:我感觉你还没有真正阅读我的答案。
  • 我读到你建议坚持使用 If/ElseIf,我只是觉得给出代码并说“不要使用它”很奇怪
  • @GôTô:OP 询问 1)代码是否会“工作”; 2) 如果有任何理由不使用它。我不想简单地对第一个问题说“不”,因为这可能会误导 OP 认为如果他尝试它并编译它,我将被证明是错误的,因此我的答案将无效。事实是它可以编译,但它仍然错误。在这一点上,我觉得我的回答很清楚。我在任何地方都不建议Option Strict Off 代码是一个好主意。但你说服了我;我会以粗体添加注释,以免误解我的观点。
【解决方案2】:

我认为您只能对一个变量设置条件。 您可以在选择案例中添加一个选择案例,但我怀疑您可以做得更好。

http://msdn.microsoft.com/en-gb/library/cy37t14y%28v=VS.80%29.aspx

【讨论】:

    【解决方案3】:
    1. 没有那种确切的语法,不
    2. 见 1。:-)

    您可以在这里使用的一种技术是利用 VB.NET 允许的 C# 不允许的一件事 - 即非常量 Case 条件(我猜到了变量 Seller) :

    Select Case True
    Case Seller = "TRADE_IN" And Condition = KBB_CONDITION_EXCELLENT
        Vehicle.MarketValue = Response.TradeInExcellent
    Case Seller = "PRIVATE_PARTY" Condition = KBB_CONDITION_EXCELLENT
        Vehicle.MarketValue = Response.PrivatePartyExcellent
    ' etc
    End Select
    

    Cases 将按顺序进行评估,直到出现 True


    但是!如果Select Case 所做的只是从卖方和条件的组合映射到Response,我建议进行整个操作的更好方法是(仅一次)设置一个嵌套的Dictionary,其中包含映射数据,然后在需要Response 时查找其中的值。如果您有兴趣,我可以对此进行扩展...

    【讨论】:

    • 我看不出你的“Select Case True”比“If”好多少
    • @GoTo:好吧,如果你真的想使用 Select Case 语句,这就是要走的路。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-13
    • 2023-04-10
    • 2010-10-30
    • 2016-05-13
    • 2016-02-21
    • 1970-01-01
    • 2017-06-23
    相关资源
    最近更新 更多