提问人:Jim Counts 提问时间:2/23/2009 最后编辑:Stephen KennedyJim Counts 更新时间:2/25/2022 访问量:283013
VB.NET 中是否有条件三元运算符?
Is there a conditional ternary operator in VB.NET?
问:
在Perl(和其他语言)中,条件三元运算符可以这样表示:
my $foo = $bar == $buz ? $cat : $dog;
VB.NET 有类似的运营商吗?
答:
669赞
Beep beep
2/23/2009
#1
取决于版本。VB.NET 2008 中的运算符是三元运算符(以及零合并运算符)。这是刚刚推出的,在 2008 年之前不可用。下面是一些详细信息:Visual Basic If 公告If
例:
Dim foo as String = If(bar = buz, cat, dog)
[编辑]
在 2008 年之前,它的工作方式与上述运算符几乎相同。IIf
If
例:
Dim foo as String = IIf(bar = buz, cat, dog)
评论
17赞
Zooba
2/23/2009
在 2008 年之前,它是 IIf,它的工作方式与您的链接中描述的 If 运算符几乎相同。
149赞
Greg Hewgill
2/23/2009
...重要的区别是 Iif() 作为一个函数,总是同时计算结果函数和备选函数,而新的 If 只计算其中之一。
6赞
kbvishnu
1/20/2012
这是什么意思?如果 (condition,true-part,false-part)。我可以参加仪式吗?
13赞
crush
2/11/2015
我是一个非常喜欢 C 的人,但我发现这种语法比传统的三元运算符更干净。
13赞
Joseph Nields
4/21/2015
另一个重要的区别是:总是返回一个类型的对象,而允许在选项严格打开的情况下进行类型检查。(不会在选项严格开启的情况下编译,因为您可以很容易地编写.不过,您可以在 option strict on 上写入,因为它会检查返回的类型。Iif
Object
If(bool, obj, obj)
Dim var As Integer = Iif(true, 1, 2)
Dim var As Integer = Iif(true, new Object(), new Object())
Dim var As Integer = If(true, 1, 2)
84赞
Kris Erickson
2/23/2009
#2
iif 在 VB 中一直可用,甚至在 VB6 中也是如此。
Dim foo as String = iif(bar = buz, cat, dog)
因此,它不是真正的运算符,而是 Microsoft.VisualBasic 命名空间中的函数。
评论
33赞
Beep beep
2/23/2009
不过,Iif 只接近三元运算符 - 这意味着您不能在 If Then Else(或三元运算符)的所有条件下使用它。例如,Value = Iif(1 = 1, 0, 1/0) 会爆炸,但 Value = If(1 = 1, 0, 1/0) 不会......
4赞
Kris Erickson
2/23/2009
VB 不支持短路计算(AndAlso 运算符除外),因此 VB 程序员并不真正期望他们可以安全地评估一半的操作。但要注意的是,iif 也是一个 hack 函数,是为了向后兼容而放入的,否则它将是一个真正的操作员。
39赞
HardCode
2/24/2009
很高兴对所有 VB 程序员进行分类;-)并且还有 IsNot 和 OrElse 可以快捷,所以 VB 确实支持短路评估。
3赞
LosManos
12/19/2012
Iif 是一个常规方法调用,用于评估所有参数。它不是三元的。Se dotnetslackers.com/VB_NET/...
4赞
Kris Erickson
12/19/2012
正如我所说,它不是一个真正的运算符,vb6 不支持短路评估,所以它总是在线评估所有操作。
28赞
unnknown
8/16/2012
#3
If()
是最接近的等价物,但如果您设置了 ,请注意正在进行的隐式转换。Option Strict off
例如,如果你不小心,你可能会想尝试这样的事情:
Dim foo As Integer? = If(someTrueExpression, Nothing, 2)
将给出一个值 !foo
0
我认为 C# 中的等效运算符反而会失败编译。?
评论
9赞
Mark Hurd
2/4/2015
为了完整起见,写该表达式的更好方法是 .Dim foo As Integer? = If( someTrueExpression, New Integer?, 2)
12赞
Heinzi
12/10/2015
请注意,这种情况也会发生在 中。原因是 in VB.NET 等价于 C# 而不是 .Option Strict On
Nothing
default(T)
null
2赞
AjV Jsy
6/17/2016
对于任何对此感到困惑的人,这意味着它是可为空的 - 请参阅 stackoverflow.com/questions/3628757/make-an-integer-nullInteger?
3赞
Aranxo
12/5/2020
#4
仅供记录,以下是 If 和 IIf 之间的区别:
IIf(条件、真部分、假部分):
- 这是旧的VB6 / VBA函数
- 该函数始终返回 Object 类型,因此,如果要使用所选对象的方法或属性,则必须使用 DirectCast 或 CType 或 Convert 将其重新强制转换为其原始类型。 函数转换为其原始类型
- 正因为如此,如果 true-part 和 false-part 是不同类型的,那就没关系了,结果无论如何都只是一个对象
如果(条件、真部分、假部分):
- 这是新的 VB.NET 功能
- 结果类型是所选部件的类型,即真部件或假部件
- 如果打开了严格模式并且这两个部分属于不同的类型,则这不起作用。在严格模式下,它们必须属于同一类型,否则您将收到异常
- 如果确实需要两个不同类型的部件,请关闭严格模式(或使用 IIf)
- 到目前为止,我还没有尝试过严格模式是否允许不同类型的对象,但继承自相同的基础或实现相同的接口。Microsoft 文档对此问题不太有帮助。也许这里有人知道。
0赞
Eli Fry
1/12/2022
#5
If(<expression>, <expressionIfNothing>)
如果计算结果为非 Nothing 的引用或可为 Null 值,则该函数将返回该值。否则,它将计算并返回 (Intellisense)<expression>
<expressionIfNothing>
这对于检查特定值是否存在以及是否替换它非常有用。
例:
If(cat, dog)
这里,如果 cat 不为 null,它将返回 cat。如果为 null,则返回 dog。大多数情况下,对于此方案,您将使用三元运算符。但是,如果您不想返回正在测试的值,则必须改用它:
If(condition, cat(true), dog(false))
评论
0赞
Eli Fry
2/25/2022
我的答案添加到现有的答案中,它不会反映在可接受的答案中,如果这是他们使用它的用例,可能会更简单。不幸的是,我没有足够的声誉来评论该帖子来分享我的更新。
评论