Bất cứ điều gì mà có toán tử so sánh điều kiện tiên quyết (=,> =, = <, vv) được định nghĩa là trò chơi công bằng cho Select Case
. Đúng (hoặc sai), tài liệu tham khảo không được so sánh với =
trong VB; người ta phải sử dụng Is
. (Hoặc Object.Equals(objA As Object, objB As Object)
- nhưng, thực sự, tại sao? Khi bạn có Is
?)
Nhưng hãy xem Object equality behaves different in .NET - có lẽ cách VB ít gây nhầm lẫn? Dù sao, tôi nghĩ bạn bị mắc kẹt với thang If-ElseIf kể từ Select Case
không làm Is
. (Tốt, nó làm, nhưng đó là một khác nhau Is
, giống như các it
của HyperCard.) Tôi nghĩ rằng các bậc thang trông thông minh và dễ dàng để làm theo:
If sender Is StyleBoldButton Then
ElseIf sender Is StyleUnderButton Then
ElseIf sender Is StyleItalicButton Then
Else
End If
Như bạn đã chỉ ra, mô hình Select Case True
là một " OrElse "giải pháp ngắn mạch trong VB6 - một cách tuyệt vời để đáp ứng nhu cầu thực sự. Nhưng điều đó không cần thiết trong VB.NET. Trong tinh thần đó, có thể tốt hơn là sử dụng các mẫu thiết kế phù hợp hơn với các phương pháp hay nhất được mong đợi của một ngôn ngữ hướng đối tượng. Ví dụ, như Denis Troller đã đề xuất, tại sao không cho mỗi nút xử lý sự kiện của riêng mình?
Nhưng nếu bạn nhấn mạnh vào một cái gì đó giống như một Chọn Is-thể, đây là một cái gì đó tôi có lẽ sẽ không sử dụng bản thân mình:
With sender
If .Equals(StyleBoldButton) Then
ElseIf .Equals(StyleUnderButton) Then
ElseIf .Equals(StyleItalicButton) Then
Else
End If
End With
Ở đây tôi đang trông chờ vào .Equals
để làm việc như C# ==
khi phải đối mặt với hai loại object
để so sánh (xem http://visualstudiomagazine.com/articles/2011/02/01/equality-in-net.aspx). Vẻ đẹp của điều này là sender
chỉ được đề cập một lần; tuy nhiên, có tất cả số này ElseIf .Equals(...) Then
bạn sẽ phải nhập cho từng "Case".
Một cách khác tôi sẽ không sử dụng bản thân mình đang sử dụng GetHashCode()
:
Select Case sender.GetHashCode()
Case StyleBoldButton.GetHashCode()
Case StyleUnderButton.GetHashCode()
Case StyleItalicButton.GetHashCode()
Case Else
End Select
Ở đây tôi đang trông chờ vào những gì (rất) ít tôi biết GetHashCode()
để duy nhất (đủ) xác định các điều khiển. (Xem Default implementation for Object.GetHashCode()).
Có thể là cách tốt hơn khi sử dụng đa hình. Bạn đang làm gì với 'người gửi'? Có lẽ bạn có thể tóm tắt chức năng đó thành một thao tác đơn lẻ có thể hoạt động trên từng loại nút? Sau đó, bạn sẽ không cần 'Chọn' nhưng sẽ chỉ thực hiện thao tác đó bất kể loại nào? – David
'Nếu người gửi là StyleBoldButton ElseIf .... End If'? Đẹp hơn để xem có lẽ không, dễ hiểu hơn có lẽ là có, vì bí quyết 'Chọn Case True' không phải là AFAIK được sử dụng rộng rãi trong VB.NET –
@David Mmmhh ... Tôi cần đặt một biến khác cho mỗi nút. Tuy nhiên, BOLD và ITALIC là boolean, trong khi UNDERLINE là một loại enuberable. – Teejay