2012-07-03 29 views
12

"mı", bir select case ifadesi içindeki bazı nesneleri karşılaştırmak gerekir.VB.NET operatör

select case, = operatörünü varsayılan olarak kullanır ve bu, nesneler için tanımlanmadı, bir derleme hatası atılır. Gerçekten çalışan

Select Case True 
    Case sender Is StyleBoldButton 

    Case sender Is StyleUnderButton 

    Case sender Is StyleItalicButton 

End Select 

:

Ben şu anda bu geçici çözümü kullanın.

görmek güzel bir şey ve daha anlaşılır var mı?

+1

Polimorfizm kullanmanın daha iyi bir yolu vardır. Nihayetinde "gönderen" ile yaptığınız şey nedir? Belki de bu işlevsellik, her bir buton üzerinde çalışacak tek bir operasyonda soyutlanabilir mi? O zaman "Seç" e ihtiyacınız olmazdı, ancak bu türden bağımsız olarak bu işlemi yapar mıydınız? – David

+1

'Gönderen StilBoldButton ElseIf ise ... End If'? Belki de daha güzel, belki de daha anlaşılabilir bir durumdur, çünkü 'Select Case True' hilesi, VB.NET –

+0

@David Mmmhh'de çok yaygın olarak kullanılan AFAIK değildir. Her bir düğme için farklı bir değişken belirlemeliyim. Ancak, BOLD ve ITALIC, boolean'ken, UNDERLINE ise envantere alınabilir bir türdür. – Teejay

cevap

10

şey (=,> =, < = vb) tanımlanmış Select Case için adil bir oyun. Doğru (veya yanlış) referanslar, VB'de = ile karşılaştırılamaz; biri Is kullanmalıdır. (Veya Object.Equals(objA As Object, objB As Object) - ama, gerçekten, neden? Is var mı?)

Ancak Object equality behaves different in .NET'a bir göz atın - belki de VB yolu daha az kafa karıştırıcı mı? Her neyse, sanırım Select Case'dan beri If-ElseIf merdiveni ile sıkışmışsın Is yapmıyor. (Iyi, öyle, ama bu daha HyperCard ait it gibi farklı bir Is bu.) Ben merdiveni takip etmek akıllı ve kolay görünüyor düşünüyorum:

sen işaret gibi
If sender Is StyleBoldButton Then 

ElseIf sender Is StyleUnderButton Then 

ElseIf sender Is StyleItalicButton Then 

Else 

End If 

, Select Case True desen bir " OrElse "VB6'da kısa devre çözümü - gerçek bir ihtiyacı karşılamada başarılı bir yol. Ancak bu VB.NET'de gerekli değildir. Bu ruhla, belki de, tasarım modellerini nesne yönelimli bir dilden beklenen en iyi uygulamalarla daha iyi kullanmak daha iyidir. Örneğin, Denis Troller'in önerdiği gibi, neden her düğmeyi kendi olay işleyicisine vermiyorsunuz? Bir Is-muktedir Select gibi bir şey ısrar ederseniz

Ama burada ben muhtemelen kendimi kullanmaz şey: İşte karşılaştıklarında C# == gibi işe .Equals güveniyorum

With sender 
    If .Equals(StyleBoldButton) Then 

    ElseIf .Equals(StyleUnderButton) Then 

    ElseIf .Equals(StyleItalicButton) Then 

    Else 

    End If 
End With 

Karşılaştırılacak iki tür (http://visualstudiomagazine.com/articles/2011/02/01/equality-in-net.aspx). Bunun güzelliği, sender'un yalnızca bir kez belirtilmiş olmasıdır; Ancak tüm bu "Case" için yazmanız gereken tüm bu ElseIf .Equals(...) Then var.

başka yolu da kendimi GetHashCode() kullanıyor kullanmaz:

Select Case sender.GetHashCode() 

    Case StyleBoldButton.GetHashCode() 

    Case StyleUnderButton.GetHashCode() 

    Case StyleItalicButton.GetHashCode() 

    Case Else 

End Select 

Burada (çok) küçük ben benzersiz (yeterli) bu kontrolleri tanımlamak için GetHashCode() bildiklerini güveniyorum. (Bkz. Default implementation for Object.GetHashCode()).

+1

Muhtemelen soruma en iyi cevap "Yapamazsın" olurdu. Ama çözümleriniz gayet iyi :) – Teejay

+0

GetHashCode bir nesneyi tanımlamak için güvenilmemelidir. Hash kodu farklı nesneler için aynı olabilir. – jo0ls

-1

Az özlü, ama çok daha okunabilir: Gerekli karşılaştırma operatörlerini sahiptir

if typeof(sender) is StyleBoldButton then 

elseif typeof(sender) is StyleUnderButton then 

elseif typeof(sender) is StyleItalicButton then 

else 

end if 
+2

OP'nin, (Nesne sınıfları) değil, referansları (Nesnelerin örneklerini) karşılaştırdığını (sözdizimsel şeker) sorduğuna inanıyorum. Ayrıca, yukarıdaki yorumlarda bir If-Then-ElseIf merdiveni önerildi. – rskar

+0

@rskar Tam olarak, referansları değil türleri karşılaştırmalıyım. BTW, tip karşılaştırması durumunda, typeof (sender) .toString() muhtemelen en iyi yoldur. – Teejay

-2
Private Sub btnNum_Click(sender As Object, e As EventArgs) Handles btnNum0.Click, btnNum1.Click, btnNum2.Click, btnNum3.Click, btnNum4.Click, btnNum5.Click, btnNum6.Click, btnNum7.Click, btnNum8.Click, btnNum9.Click, btnDicemalPoint.Click, btnNumClear.Click, btnExit.Click 
     If result = "0" Then 
      result = "" 
     End If 
     Select Case True 
      Case sender Is btnNum0 
       If result <> "0" Then 
        result = result & "0" 
       End If 
      Case sender Is btnNum1 
       result = result & "1" 
      Case sender Is btnNum2 
       result = result & "2" 
      Case sender Is btnNum3 
       result = result & "3" 
      Case sender Is btnNum4 
       result = result & "4" 
      Case sender Is btnNum5 
       result = result & "5" 
      Case sender Is btnNum6 
       result = result & "6" 
      Case sender Is btnNum7 
       result = result & "7" 
      Case sender Is btnNum8 
       result = result & "8" 
      Case sender Is btnNum9 
       result = result & "9" 
      Case sender Is btnDicemalPoint 
       If String.IsNullOrEmpty(result.ToString) Then 
        result = result & "0." 
       ElseIf Not result.ToString.Contains(".") Then 
        result = result & "." 
       End If 
      Case sender Is btnNumClear 
       result = 0 
      Case sender Is btnExit 
       Me.Close() 
     End Select 
End Sub 
+3

OP'in kendi çözümünü nasıl geliştirdiğini açıklayabilir misiniz? –

4

Bu sorunla karşılaştım.Ben :)

Select Case DirectCast(sender, Button).Name 
     Case StyleBoldButton.Name 

     Case StyleUnderButton.Name 

     Case StyleItalicButton.Name 

    End Select 

Güncelleme 6-16-16 yaptığı gibi başka yazı ve bu yazıyı gördükten sonra kendim için bu çözüm geldi ve ben, bir kişinin paylaşmak istedim orada gerçekten Seç Kılıfı kullanmak istedi: Gereksiz olduğu için "Is =" kaldırıldı.

Güncelleştirme 8-27-16: Daha iyi hata izleme için .Name kullanmak için dizelerin kullanımını değiştirdi.

+0

'Case is = 'StyleBoldButton'' 'Case 'StyleBoldButton'' hakkında size ne veriyor? 'Ol' gereksizdir ve bu nedenle soruyla ilgisizdir. –

+0

Beynim, çözümümün bir dize karşılaştırması olduğunu anlamak yerine OPS'nin nesne karşılaştırması çözümüne takıldığından dolayı, İşleç operatörünü gerçekten düşünmeden oraya koydum. – Jeffrey

+0

En azından 'Case StyleBoldButton.Name 'işlevini kullanın, böylece ad (veya daha ziyade) adı değiştiğinde beklenmedik sonuçlar almazsınız. – NiKiZe