【问题标题】:Nested inline if statement嵌套的内联 if 语句
【发布时间】:2017-03-24 15:23:34
【问题描述】:

在 VB .Net 中,可以像这样使用内联 If 语句

if a Then ret = "A" Else ret = "Not A"

我知道也可以嵌套这些语句。我知道这可能不是好的做法,因为可读性会下降......

If a Then If b Then ret = "A & B" Else ret = "A & Not B" Else ret = "Not A"

将像这样评估:

If a Then
    If b Then
        ret = "A & B"
    Else
        ret = "A & Not B"
    End If
Else
    ret = "Not A"
End If

现在,如果我删除最后一个 Else 语句,我会得到:

If a Then If b Then ret = "A & B" Else ret = "A & Not B"

这是:

If a Then
    If b Then
        ret = "A & B"
    Else
        ret = "A & Not B"
    End If
End If

所以我猜编译器会找到 Else 并将其与行中的最后一个 openend If 匹配,这是有道理的。 我的问题是:是否可以更改评估顺序?我的意思是 Else 是否可能与第一个 if 匹配?

所以它看起来像这样:

If a Then
    If b Then
        ret = "A & B"
    End If
Else
    ret = "Not A"
End If

但内联(类似这样,添加括号以理解我的意思):

If a Then ( If b Then ret = "A & B" ) Else ret = "Not A"

我尝试使用括号或添加 End If,但它会引发语法错误,并且我找不到相关文档。

我没有卡在任何地方,我知道这可能不是一个好的编程习惯,但我只是想知道(出于好奇)是否可能。

我也知道我可以切换语句(即在 a 之前测试 b),但假设我不能(a 是一个列表,并且必须在 b 之前测试 Nothing,例如,这将是计数)。

【问题讨论】:

  • 如果您对编译器感到困惑,想象一下您自己试图理解这 6 个月后的情况

标签: vb.net if-statement nested conditional-operator


【解决方案1】:

我刚刚使用您的最终嵌套 if 语句创建了一个简单的控制台应用程序,它运行良好

Sub Main()
    Dim a = False
    Dim b = True
    If a Then
        If b Then
            Console.WriteLine("A & B")
        End If
    Else
        Console.WriteLine("A & Not B")
    End If
    Console.ReadLine()
End Sub

【讨论】:

  • 我知道这会起作用,我想问是否可以在内联语句中做到这一点。
【解决方案2】:

你可以这样做

ret = If(a, If(b, "A & B", "A & Not B"), "Not A")

就我个人而言,我从不理解需要将所有内容放在一行中。

【讨论】:

  • 问题在于这两个语句都被评估(From here)。
  • 那个链接说的是相反的@MartinVerjans。短路意味着只评估适用的部分。内部 If 只会在 a 为真时执行,否则它会“跳转”到假部分
  • If 运算符与 @MartinVerjans 的 If 语句不同
  • @MartinVerjans IIF 的行为与 IF 不同。
  • 是否有任何导入要做或参考添加?使用VS 2012 Express和.Net 3.5,编译器无法识别...
【解决方案3】:

你可能会发现这正是你所需要的:

If a And B Then

   ret = "A & B"

Else

   ret = "Not A"

End If

或单行:

If A And B Then Ret = "A & B" Else RET = "Not A"

【讨论】:

    猜你喜欢
    • 2012-03-25
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 2016-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多