ElseIf or Case Statement in VB.NET
当使用
请考虑以下示例…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | Dim lobjExample As Object = GetARandomDataTypeCrapExample() If lobjExample Is GetType(Boolean) Then ' Solve world hunger here ElseIf lobjExample Is GetType(Byte) Then ' Solve world hunger here ElseIf lobjExample Is GetType(Char) Then ' Solve world hunger here ElseIf lobjExample Is GetType(Date) Then ' Solve world hunger here ElseIf lobjExample Is GetType(Decimal) Then ' Solve world hunger here ElseIf lobjExample Is GetType(String) Then ' Solve world hunger here ElseIf lobjExample Is GetType(Integer) Then ' Solve world hunger here ElseIf lobjExample Is GetType(Double) Then ' Solve world hunger here ElseIf lobjExample Is GetType(Long) Then ' Solve world hunger here ElseIf lobjExample Is GetType(SByte) Then ' Solve world hunger here ElseIf lobjExample Is GetType(Short) Then ' Solve world hunger here ElseIf lobjExample Is GetType(Single) Then ' Solve world hunger here ElseIf lobjExample Is GetType(ULong) Then ' Solve world hunger here ElseIf lobjExample Is GetType(UInteger) Then ' Solve world hunger here ElseIf lobjExample Is GetType(UShort) Then ' Solve world hunger here Else ' Cannot solve world hunger End If |
这是否更适合作为案例陈述?
vb.net select case语句非常灵活。比等价的c switch关键字要多得多。这一切都是有意的,也是语言背后哲学的一部分。如果vb.net对程序员是友好的,那么c对机器是友好的。
.NET中间语言有一个专用的操作码来实现这类语句opcodes.switch。它将在运行时抖动到一个跳转表,非常快,如果跳转表是"完美的",所有插槽都已填满,则不需要if-then-else代码。
但是它有一个实际的限制,跳转表条目必须在编译时知道。如果您的case语句是常量表达式,那么它可以正常工作。C编译器在switch语句案例中允许的类型。但这不能是object.getType()的值,"type handle"是在运行时生成的,它的值将完全取决于之前所进行的抖动。
因此,vb.net编译器做了一件对程序员友好的事情,并将您的select case语句转换为if-then-else语句链。就像你亲手写的那样。使用ildasm.exe工具自己查看。
所以别拘束你的风格,这没什么区别。唯一你想知道的是,一个查阅表格是否能使它更快。一个
也许值得注意的是即将到来的精选案例类型的语句。它只是语法上的甜言蜜语,而不是性能。