2012-07-03 9 views
12

के साथ केस का चयन करें VB.NET में, मुझे select case कथन के भीतर कुछ ऑब्जेक्ट्स की तुलना करना है।"Is" ऑपरेटर

select case डिफ़ॉल्ट रूप से = ऑपरेटर का उपयोग करता है और यह वस्तुओं के लिए परिभाषित नहीं किया गया है, एक संकलन त्रुटि फेंक दी गई है।

Select Case True 
    Case sender Is StyleBoldButton 

    Case sender Is StyleUnderButton 

    Case sender Is StyleItalicButton 

End Select 

जो वास्तव में काम करता है:

मैं वर्तमान में इस समाधान का उपयोग करें।

क्या देखने के लिए कुछ और अधिक समझदार है और अधिक समझ में आता है?

+1

शायद बहुरूपता का उपयोग करके एक बेहतर तरीका है। यह क्या है कि आप आखिरकार 'प्रेषक' के साथ कर रहे हैं? हो सकता है कि आप उस कार्यक्षमता को उस एकल ऑपरेशन में अमूर्त कर सकें जो प्रत्येक प्रकार के बटन पर काम करेगी? तो आपको 'चयन' की आवश्यकता नहीं होगी, लेकिन इस प्रकार के बावजूद उस ऑपरेशन को निष्पादित करेगा? – David

+1

'अगर प्रेषक स्टाइल बोल्डबटन ElseIf है .... अंत यदि '? संभवतया देखने के लिए सुंदर नहीं, शायद अधिक समझने योग्य हां, चूंकि 'केस का चयन करें' चाल का उपयोग AFAIK VB.NET –

+0

@ डेविड मम्मह में व्यापक रूप से उपयोग नहीं किया जाता है ... मुझे प्रत्येक बटन के लिए एक अलग चर सेट करने की आवश्यकता है। लेकिन बोल्ड और इटालिक बूलियन हैं, जबकि अंडरलाइन एक उत्साही प्रकार है। – Teejay

उत्तर

10

कुछ भी अपेक्षित तुलना ऑपरेटरों है कि (=,> =, < =, आदि) में परिभाषित किया Select Case के लिए निष्पक्ष खेल है। सही (या गलत तरीके से), संदर्भों की तुलना VB में = से नहीं की जाती है; किसी को Is का उपयोग करना चाहिए। (या Object.Equals(objA As Object, objB As Object) - लेकिन, वास्तव में, इसलिए जब आप Is मिल गया है?)

लेकिन Object equality behaves different in .NET पर एक नज़र डालें - शायद वीबी तरह से कम भ्रामक है? जो भी हो, मुझे लगता है कि अगर आप Select CaseIs नहीं करते हैं तो आप if-ElseIf सीढ़ी से फंस गए हैं। (अच्छी तरह से, यह होता है, लेकिन यह है कि अधिक हाइपर कार्ड के it की तरह एक अलग Is है,।) मैं सीढ़ी का पालन करने को सहज और आसान लग रहा है लगता है:

If sender Is StyleBoldButton Then 

ElseIf sender Is StyleUnderButton Then 

ElseIf sender Is StyleItalicButton Then 

Else 

End If 

आप ने बताया है के रूप में, Select Case True पैटर्न है एक " OrElse "वीबी 6 में शॉर्ट-सर्किट वर्कअराउंड - वास्तविक आवश्यकता को पूरा करने के लिए एक शानदार तरीका। लेकिन वीबी.नेट में इसकी आवश्यकता नहीं है। उस भावना में, शायद ऑब्जेक्ट उन्मुख भाषा की अपेक्षा की जाने वाली सर्वोत्तम प्रथाओं के अनुरूप डिजाइन पैटर्न का उपयोग करना बेहतर होगा। उदाहरण के लिए, डेनिस ट्रॉलर ने सुझाव दिया, क्यों प्रत्येक बटन को अपना ईवेंट हैंडलर न दें?

लेकिन अगर आप एक Is-सक्षम करें की तरह कुछ पर जोर देते हैं, यहाँ कुछ मैं शायद अपने आप का उपयोग नहीं होगा है:

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() के बारे में पता विशिष्ट (पर्याप्त) इन नियंत्रणों की पहचान करने पर भरोसा कर रहा हूँ। (Default implementation for Object.GetHashCode() देखें)।

+1

शायद मेरे प्रश्न का सबसे अच्छा जवाब "आप नहीं कर सकते" होगा। लेकिन आपके समाधान ठीक हैं :) – Teejay

+0

किसी ऑब्जेक्ट की पहचान करने के लिए GetHashCode पर भरोसा नहीं किया जाना चाहिए। हैशकोड विभिन्न वस्तुओं के लिए समान हो सकता है। – jo0ls

-1

कम संक्षिप्त, लेकिन बहुत अधिक पठनीय:

if typeof(sender) is StyleBoldButton then 

elseif typeof(sender) is StyleUnderButton then 

elseif typeof(sender) is StyleItalicButton then 

else 

end if 
+2

मेरा मानना ​​है कि ओपी संदर्भ (वस्तुओं के उदाहरण) की तुलना में (ऑब्जेक्ट्स के वर्ग) की तुलना में (सिंटेक्टिक चीनी) के बारे में पूछ रहा था। इसके अलावा, उपरोक्त टिप्पणियों में एक अगर-फिर-ElseIf सीढ़ी पहले से ही सुझाव दिया गया था। – rskar

+0

@rskar बिल्कुल, मुझे संदर्भों की तुलना करने की आवश्यकता है, प्रकार नहीं। बीटीडब्ल्यू, प्रकार की तुलना के मामले में, टाइपऑफ (प्रेषक) .toString() शायद सबसे अच्छा तरीका है। – 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

क्या आप समझा सकते हैं कि यह ओपी के अपने समाधान पर कैसे सुधार करता है? –

4

मैं बस इसी समस्या में आया।एक और पोस्ट और इस पोस्ट को देखने के बाद मैं खुद के लिए इस समाधान के लिए आया था और मैं मामले में किसी को साझा करना चाहते थे वहाँ वास्तव में है कि मैं :)

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

     Case StyleUnderButton.Name 

     Case StyleItalicButton.Name 

    End Select 

अद्यतन 6-16-16 किया केस का चयन उपयोग करना चाहता था: हटाया गया "है =" क्योंकि यह अनावश्यक था।

अद्यतन 8-27-16: बेहतर त्रुटि ट्रैकिंग के लिए उपयोग करने के लिए तारों का उपयोग बदल दिया।

+0

'केस इज़ =' स्टाइलबल्ड बटन क्या है '' आपको 'केस' स्टाइलबल्डबटन '' पर 'देता है? 'Is' अनावश्यक है और इस प्रकार सवाल के लिए अप्रासंगिक है। –

+0

क्योंकि मेरा दिमाग ऑब्जेक्ट तुलना के ओपीएस समाधान पर फंस गया है, यह समझने के बजाय कि मेरा समाधान एक स्ट्रिंग तुलना था, इसलिए मैंने वास्तव में इसके बारे में सोचने के बिना वहां ऑपरेटर लगाया। – Jeffrey

+0

कम से कम 'केस स्टाइल बोल्डबटन # नाम' का उपयोग करें ताकि आपको अनपेक्षित परिणाम न मिले (यदि बल्कि) नाम बदलते हैं। – NiKiZe

संबंधित मुद्दे