在VB.NET中,我必须比较select case语句中的某些对象.
由于默认情况下select case uses = operator,并且没有为对象定义,因此会抛出编译错误.
我目前使用此解决方法:
Select Case True Case sender Is StyleBoldButton Case sender Is StyleUnderButton Case sender Is StyleItalicButton End Select
其实是有效的.
有什么更漂亮的看到和更容易理解吗?
任何具有必要的比较运算符(=,> =,< =等)的定义是选择案例的公平游戏.正确(或错误地),引用只是不与VB中的=进行比较;必须使用Is. (或Object.Equals(objA As Object,objB As Object) - 但是,真的,为什么?当你有?) 但是看看
Object equality behaves different in .NET – 也许VB的方式不那么混乱?无论如何,我认为你因为选择案例不做而被困在If-ElseIf梯子上. (嗯,它是,但这是一个不同的是,更像是Hypercard.)我认为梯子看起来聪明,容易遵循:
If sender Is StyleBoldButton Then ElseIf sender Is StyleUnderButton Then ElseIf sender Is StyleItalicButton Then Else End If
正如您所指出的那样,选择案例True模式是VB6中的“OrElse”短路解决方案 – 这是一个满足真正需求的一个绝对的方式.但VB.NET中并不需要.以这种精神,也许更好地使用设计模式更符合面向对象语言的最佳实践.例如,Denis Troller建议,为什么不给每个按钮自己的事件处理程序?
但是如果你坚持像可以选择这样的东西,那么我可能不会使用自己:
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).这个优点是发件人只提到一次;然而,所有这些ElseIf .Equals(…)然后你必须为每个“案例”键入.
我不会使用自己的另一种方法是使用GetHashCode():
Select Case sender.GetHashCode() Case StyleBoldButton.GetHashCode() Case StyleUnderButton.GetHashCode() Case StyleItalicButton.GetHashCode() Case Else End Select
在这里我指望(知道)GetHashCode()的唯一(足够)识别这些控件的(非常)小的. (见Default implementation for Object.GetHashCode()).