Ответ 1
Все, что имеет необходимые операторы сравнения (=, > =, <= и т.д.), является справедливой игрой для 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
- это временное решение короткого замыкания "OrElse" в VB6 - неудобный способ удовлетворить реальную потребность. Но это не нужно в VB.NET. В этом духе, возможно, лучше использовать шаблоны проектирования в соответствии с лучшими практиками, ожидаемыми от объектно-ориентированного языка. Например, как предложил Денис Тролльер, почему бы не дать каждой кнопке собственный обработчик событий?
Но если вы настаиваете на чем-то вроде Is-able Select, здесь я, вероятно, не буду использовать себя:
With sender
If .Equals(StyleBoldButton) Then
ElseIf .Equals(StyleUnderButton) Then
ElseIf .Equals(StyleItalicButton) Then
Else
End If
End With
Здесь я рассчитываю на .Equals
работать как С# ==
, когда сталкиваются с двумя типами 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()
, чтобы однозначно (достаточно) идентифицировать эти элементы управления. (См. Реализация по умолчанию для Object.GetHashCode()).