任何定义了必要的比较运算符(=、>=、<= 等)的东西对于Select Case
. 正确(或错误),引用只是不与=
VB 中的比较;一个必须使用Is
。(或者Object.Equals(objA As Object, objB As Object)
- 但是,真的,为什么?当你有的时候Is
?)
但是看看对象相等在 .NET 中的行为是不同的——也许 VB 的方式不那么令人困惑?无论如何,我认为你被困在 If-ElseIf 梯子上,因为Select Case
不做Is
. (嗯,确实如此,但这是一个不同的Is
,更像it
是 Hypercard。)我认为梯子看起来很聪明,很容易理解:
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# 一样工作(请参阅http://visualstudiomagazine.com/articles/2011/02/01/equality-in-net.aspx)。它的美妙之处在于它只被提及过一次;但是,您必须为每个“案例”键入所有这些内容。==
object
sender
ElseIf .Equals( ... ) Then
我不会使用自己的另一种方法是使用GetHashCode()
:
Select Case sender.GetHashCode()
Case StyleBoldButton.GetHashCode()
Case StyleUnderButton.GetHashCode()
Case StyleItalicButton.GetHashCode()
Case Else
End Select
在这里,我指望我所知道的(非常)少的东西GetHashCode()
来唯一(足够)识别这些控件。(参见Object.GetHashCode() 的默认实现)。