在VB.NET中,我必须比较select case
语句中的一些对象。
由于select case
默认使用=
运算符,而且没有为对象定义,因此会抛出编译错误。
我目前使用此解决方法:
Select Case True
Case sender Is StyleBoldButton
Case sender Is StyleUnderButton
Case sender Is StyleItalicButton
End Select
实际上有效。
有什么比较漂亮的东西更容易理解吗?
答案 0 :(得分:11)
任何具有必需的比较运算符(=,> =,< =等)的东西都是Select Case
的公平游戏。正确(或错误地)引用只是不与VB中的=
进行比较;必须使用Is
。 (或Object.Equals(objA As Object, objB As Object)
- 但是,真的,为什么?当你有Is
时?)
但是看看Object equality behaves different in .NET - 也许VB方式不那么令人困惑?无论如何,我认为你已经坚持使用If-ElseIf阶梯,因为Select Case
没有Is
。 (嗯,确实如此,但这是一个不同的Is
,更像是Hypercard的it
。)我认为梯子看起来很聪明,易于理解:
If sender Is StyleBoldButton Then
ElseIf sender Is StyleUnderButton Then
ElseIf sender Is StyleItalicButton Then
Else
End If
正如您所指出的,Select Case True
模式是VB6中的“OrElse”短路解决方案 - 一种满足实际需求的难以理解的方式。但这在VB.NET中并不需要。本着这种精神,也许最好使用更符合面向对象语言所期望的最佳实践的设计模式。例如,正如Denis Troller建议的那样,为什么不给每个按钮自己的事件处理程序?
但如果你坚持像Is-able Select这样的话,我可能不会自己使用这些东西:
With sender
If .Equals(StyleBoldButton) Then
ElseIf .Equals(StyleUnderButton) Then
ElseIf .Equals(StyleItalicButton) Then
Else
End If
End With
在面对要比较的两种.Equals
类型时,我指望==
像C#object
一样工作(请参阅http://visualstudiomagazine.com/articles/2011/02/01/equality-in-net.aspx)。这样做的好处是sender
只提到一次;但是,您需要为每个“案例”键入所有这些ElseIf .Equals( ... ) Then
。
我不会自己使用的另一种方法是使用GetHashCode()
:
Select Case sender.GetHashCode()
Case StyleBoldButton.GetHashCode()
Case StyleUnderButton.GetHashCode()
Case StyleItalicButton.GetHashCode()
Case Else
End Select
在这里,我指望我({非常)知道GetHashCode()
对于唯一(足够)识别这些控件的信息。 (见Default implementation for Object.GetHashCode())。
答案 1 :(得分:5)
我刚遇到同样的问题。在看到另一篇文章和这篇文章之后,我为自己找到了这个解决方案,我想分享以防有人在那里真的想像我一样使用Select Case:)
Select Case DirectCast(sender, Button).Name
Case StyleBoldButton.Name
Case StyleUnderButton.Name
Case StyleItalicButton.Name
End Select
更新6-16-16:删除了“Is =”因为没必要。
更新8-27-16:更改了使用字符串的使用.Name以便更好地跟踪错误。
答案 2 :(得分:-1)
简洁,但更具可读性:
if typeof(sender) is StyleBoldButton then
elseif typeof(sender) is StyleUnderButton then
elseif typeof(sender) is StyleItalicButton then
else
end if
答案 3 :(得分:-2)
Private Sub btnNum_Click(sender As Object, e As EventArgs) Handles btnNum0.Click, btnNum1.Click, btnNum2.Click, btnNum3.Click, btnNum4.Click, btnNum5.Click, btnNum6.Click, btnNum7.Click, btnNum8.Click, btnNum9.Click, btnDicemalPoint.Click, btnNumClear.Click, btnExit.Click
If result = "0" Then
result = ""
End If
Select Case True
Case sender Is btnNum0
If result <> "0" Then
result = result & "0"
End If
Case sender Is btnNum1
result = result & "1"
Case sender Is btnNum2
result = result & "2"
Case sender Is btnNum3
result = result & "3"
Case sender Is btnNum4
result = result & "4"
Case sender Is btnNum5
result = result & "5"
Case sender Is btnNum6
result = result & "6"
Case sender Is btnNum7
result = result & "7"
Case sender Is btnNum8
result = result & "8"
Case sender Is btnNum9
result = result & "9"
Case sender Is btnDicemalPoint
If String.IsNullOrEmpty(result.ToString) Then
result = result & "0."
ElseIf Not result.ToString.Contains(".") Then
result = result & "."
End If
Case sender Is btnNumClear
result = 0
Case sender Is btnExit
Me.Close()
End Select
End Sub