Wszystko, co ma wymagane operatorów porównania (=,> =, = <, etc.) zdefiniowany jest uczciwa gra dla Select Case
. Słusznie (lub niesłusznie), odniesienia nie są porównywane z =
w VB; należy użyć Is
. (Lub Object.Equals(objA As Object, objB As Object)
- ale, naprawdę, dlaczego? Kiedy masz Is
?)
Ale spójrz na Object equality behaves different in .NET - być może sposób VB jest mniej mylący? Cokolwiek, myślę, że utknąłeś w drabinie If-ElseIf od Select Case
, nie robisz Is
. (Dobrze, że nie, ale to już zupełnie inna Is
, bardziej jak it
z HyperCard.) Myślę, że drabina wygląda elegancki i łatwy do naśladowania:
If sender Is StyleBoldButton Then
ElseIf sender Is StyleUnderButton Then
ElseIf sender Is StyleItalicButton Then
Else
End If
Jak podkreśliło, wzór Select Case True
jest " Orélse "obejście zwarciowe w VB6 - niewygodny sposób na zaspokojenie prawdziwej potrzeby. Ale to nie jest potrzebne w VB.NET. W tym duchu, może lepiej jest używać wzorców projektowych bardziej zgodnie z najlepszymi praktykami, jakich można oczekiwać od języka zorientowanego obiektowo. Na przykład, jak zasugerował Denis Troller, czemu nie dać każdemu przyciskowi własnego programu obsługi zdarzeń?
Ale jeśli nalegać na coś takiego IS-stanie Select, oto coś, co prawdopodobnie nie będzie używać sobie:
With sender
If .Equals(StyleBoldButton) Then
ElseIf .Equals(StyleUnderButton) Then
ElseIf .Equals(StyleItalicButton) Then
Else
End If
End With
Tutaj liczę na .Equals
pracować jak C# ==
w obliczu dwa typy do porównania (zobacz http://visualstudiomagazine.com/articles/2011/02/01/equality-in-net.aspx). Piękno tego jest takie, że sender
wspomniano tylko raz; jednak jest wszystko to ElseIf .Equals(...) Then
, które będziesz musiał wpisać dla każdego "Przypadku".
Innym sposobem nie użyje się używa GetHashCode()
:
Select Case sender.GetHashCode()
Case StyleBoldButton.GetHashCode()
Case StyleUnderButton.GetHashCode()
Case StyleItalicButton.GetHashCode()
Case Else
End Select
Tutaj liczę na to, co (bardzo) mało znam GetHashCode()
jednoznacznie (wystarczająco) zidentyfikować te kontrole. (Patrz Default implementation for Object.GetHashCode()).
Prawdopodobnie istnieje lepszy sposób użycia polimorfizmu. Co właściwie robisz z 'nadawcą'? Może możesz zlikwidować tę funkcjonalność do pojedynczej operacji, która działałaby na każdym typie przycisku? W takim razie nie potrzebujesz "Wybierz", ale po prostu wykonasz tę operację niezależnie od typu? – David
'Jeśli nadawcą jest StyleBoldButton ElseIf .... End If'? Lepsze, aby zobaczyć, może nie, bardziej zrozumiałe prawdopodobnie tak, ponieważ sztuczka 'Select Case True' nie jest AFAIK bardzo szeroko stosowana w VB.NET –
@ David Mmmhh ... Muszę ustawić inną zmienną dla każdego przycisku. Ale BOLD i ITALIC to boolean, podczas gdy UNDERLINE to gatunek uniwersalny. – Teejay