Tee*_*jay 13 vb.net select case
在VB.NET中,我必须比较一个select case语句中的一些对象.
由于默认情况下select case使用=operator而没有为对象定义,因此抛出了编译错误.
我目前使用此解决方法:
Select Case True
Case sender Is StyleBoldButton
Case sender Is StyleUnderButton
Case sender Is StyleItalicButton
End Select
Run Code Online (Sandbox Code Playgroud)
这实际上有效.
是否有更漂亮的东西可以看到,更容易理解?
rsk*_*kar 11
任何具有必要的比较运算符(=,> =,<=等)的东西都是公平的游戏Select Case.正确(或错误),引用只是不与=VB 比较; 必须使用Is.(或者Object.Equals(objA As Object, objB As Object)- 但是,真的,为什么?当你有了Is?)
但是看一下.NET中的Object等同行为 - 也许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
Run Code Online (Sandbox Code Playgroud)
正如您所指出的,该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
Run Code Online (Sandbox Code Playgroud)
在面对两种类型进行比较时,我指望.Equals像C#一样工作(参见http://visualstudiomagazine.com/articles/2011/02/01/equality-in-net.aspx).这种美丽只有一次提到; 然而,所有这些你必须为每个"案例"键入.==objectsenderElseIf .Equals( ... ) Then
我不会使用的另一种方法是使用GetHashCode():
Select Case sender.GetHashCode()
Case StyleBoldButton.GetHashCode()
Case StyleUnderButton.GetHashCode()
Case StyleItalicButton.GetHashCode()
Case Else
End Select
Run Code Online (Sandbox Code Playgroud)
在这里,我指望我所知道的(非常)很少GetHashCode(),唯一(足够)识别这些控件.(请参阅Object.GetHashCode()的默认实现).
我只是遇到了同样的问题。看完另一篇文章和这篇文章后,我为自己准备了这个解决方案,我想分享一下,以防有人真的想像我一样使用Select Case :)
Select Case DirectCast(sender, Button).Name
Case StyleBoldButton.Name
Case StyleUnderButton.Name
Case StyleItalicButton.Name
End Select
Run Code Online (Sandbox Code Playgroud)
更新6-16-16:删除了“ Is =”,因为它是不必要的。
更新8-27-16:将字符串的使用更改为使用.Name,以更好地跟踪错误。
| 归档时间: |
|
| 查看次数: |
14259 次 |
| 最近记录: |