2009-04-27 12 views
16

जाहिर है इस VB6 और VBA शॉर्ट सर्किट करने के लिए एक तरह से हो सकता है और पहली सच मामले निष्पादित करने के लिए इस्तेमाल किया:चुनें प्रकरण सच

Select Case True 
End Select 

इस प्रयोग (VB.NET) में अब भी है?

+0

इस 'चयन केस' हैक की बजाय वीबीएनईटी में 'एंडअल्सो' और 'ऑरलेस' शॉर्ट-सर्किटिंग ऑपरेटरों का उपयोग करें। –

उत्तर

26

में है यह वाक्य रचना अक्सर एक If...ElseIf के बजाय प्रयोग किया जाता है है बयान। कुछ लोगों को इसे पढ़ने के लिए थोड़ा आसान लगता है। उदाहरण के लिए:

Select Case True 
    Case testVariable < 0 
     Console.Write("You must supply a positive value.") 
    Case testVariable > 10 
     Console.Write("Please enter a number from 0-10.") 
    Case True 
     Call DoWork(testVariable) 
End Select 

उत्तर यह है कि हाँ, यह अभी भी VB.NET में काम करता है। जब आप इसका इस्तेमाल करते हैं तो बस सावधानी बरतें, क्योंकि यह "मानक प्रोग्रामिंग निर्माण" नहीं है और यह उन लोगों से अपरिचित हो सकता है जिन्हें भविष्य में अपना कोड बनाए रखना है।

+0

हां, वह वही है। धन्यवाद! –

3

क्या आपका ऐसा कुछ मतलब है?

Select Case True 
    Case 1 = 0 
     Console.Write("1") 
    Case 1 = 1 
     Console.Write("2") 
    Case 2 = 2 
     Console.Write("3") 
End Select 

जो में, इस कार्यक्रम 2 लिखते थे ... कि अगर तुम क्या, पूछ रहे हैं तो हाँ, कि अभी भी चारों ओर VB.NET

12

मुझे यकीन है कि कैसे इस संरचना निम्नलिखित पर कोई लाभ प्रदान करता है नहीं कर रहा हूँ:

If testVariable < 0 Then 
    Console.Write("You must supply a positive value.") 
ElseIf testVariable > 10 Then 
    Console.Write("Please enter a number less than 10.") 
Else 
    Call DoWork(testVariable) 
End If 

ऊपर संरचना है शॉर्ट सर्किट, और मैं बाहर काम करने के रूप में यह क्या करता है की कोशिश करने की जरूरत नहीं है एक मानक निर्माण।

+0

ऐसा नहीं है, लेकिन कई वीबी प्रोग्रामर सबसे शुद्ध रूप से पठनीय प्रारूप के पक्ष में गलती करते हैं, और यह तर्क दिया जा सकता है कि प्रश्न वास्तव में उस स्थिति का वर्णन करता है। डेवलपर्स की अधिक सी-एस्क्यू विविधता निश्चित रूप से आपके शिविर में हैं। @ रोलैंड टम्बल भी देखें। – Hardryv

9

अन्य ने पहले से ही उस वास्तविक प्रश्न का उत्तर दिया है, लेकिन मैं बस इस बात का उपयोग करना चाहता हूं कि मैं इस निर्माण का काफी बार उपयोग करता हूं। मुझे लगता है कि यह अक्सर एक साथ दो बूलियन शर्तों परीक्षण के सबसे पठनीय तरीका है:

Dim A As Boolean 
Dim B As Boolean 
' 
'do stuff to set values of A and B 
' 
Select Case True 
    Case A And B 
    'something 
    Case A And Not B 
    'something else 
    Case Not A And B 
    'you get the picture 
    Case Else 
    '... 
End Select 

मैं क्यों मैं इसे आसानी से पढ़ने योग्य लगता है के उस भाग को स्वीकार करते हैं कि मैं इसका इस्तेमाल करते हैं, और मैं इसे पार्स करने के लिए होने याद है कि पहली बार मैंने इसे देखा - लेकिन एक बार सफलतापूर्वक पार्स किया गया, मेरी प्रतिक्रिया "वह शानदार है!"

9

इस विषय पर बहुत भ्रम है, लेकिन ओपीएस प्रश्न का उत्तर देने के लिए: हाँ, लॉजिकल मूल्यांकन VB.Net में समान है क्योंकि यह वीबी 6 में है क्योंकि यह वीबीए में है। http://support.microsoft.com/kb/817250

चुनें प्रकरण अनुकूलन तकनीक का लाभ लेने के आप मामलों का चयन निहित सिंटैक्स का उपयोग तार्किक ऑपरेटर्स और, या, Xor, आदि के उपयोग से बचने के लिए यह इन ऑपरेटरों है कि शॉर्ट सर्किट मूल्यांकन है।

इस उदाहरण पर विचार:

Public Sub Example() 
    If A Or B Then 
     Beep 
    End If 
    Select Case True 
     Case A, B 
      Beep 
    End Select 
End Sub 

Private Function A() As Boolean 
Debug.Print "A Ran" 
    A = True 
End Function 

Private Function B() As Boolean 
Debug.Print "B Ran" 
    B = False 
End Function 

चुनें प्रकरण संस्करण केवल ए चलेंगे तो-ब्लॉक दोनों चलेंगे। यह कथन की गलती नहीं है, बल्कि यह ऑपरेटर की गलती है। यदि आप चाहें, तो आप इस तरह के शॉर्ट सर्किट को स्टेटमेंट की संरचना कर सकते हैं:

Public Sub Example2() 
    If A Then 
    ElseIf B Then 
     Beep 
    End If 
End Sub 

और बी नहीं चलेंगे। यह सिर्फ शैली का मामला है।

जानना महत्वपूर्ण बात यह है कि आप जो टालना चाहते हैं वह है एंड/या/एक्सर ऑपरेटर अगर-ब्लॉक नहीं हैं। यदि आपको इफ-ब्लॉक का चयन केस संस्करण बेहतर पसंद है ... आपको अधिक शक्ति :)

+3

ध्यान दें कि आप OrElse को शॉर्ट-सर्किट में उपयोग कर सकते हैं और केवल ए – Jack

3

Select Casea powerful operator by itself है। लेकिन भले ही Select Case True अभी भी समर्थित है, लेकिन रखरखाव परिप्रेक्ष्य के लिए इसे टालना बेहतर है।आपको हमेशा जरूरत को न्यायसंगत बनाना होगा। यदि आवश्यक रूप से आवश्यकता है, तो आप DoEvents और GoTo का भी उपयोग कर सकते हैं। स्वीकृत उत्तर के लिए, इसे इसके बजाय लिखा जा सकता था:

Select Case testVariable 
    Case Is < 0 : Console.Write("You must supply a non-negative value.") 
    Case Is > 10 : Console.Write("Please enter a number from 0-10.") 
    Case Else : Call DoWork(testVariable) 
End Select 
+0

नाइटपीकी को इंगित करने के लिए चला सकते हैं, लेकिन '0' एक "सकारात्मक मान" नहीं है। ^^ – Hardryv

+1

@ हार्ड्रीव: क्या यह अब बेहतर है? :) – Neolisk

+0

वास्तव में यह है;) – Hardryv

2

आप किसी भी रैपर प्रकार पर बराबर ऑपरेटर को परिभाषित कर सकते हैं। फिर आप चयन केस पर रैपर प्रकार का उपयोग कर सकते हैं।

नमूना रैपर।

Imports System.Runtime.InteropServices 
<DebuggerStepThrough()> Friend Module Util 
    Public Function _Is(v As Object) As IsWrapper 
     Return New IsWrapper With {.Obj = v} 
    End Function 
    Public Structure IsWrapper 
    Public Obj As Object 
    Public Shared Operator =(ByVal a As IsWrapper, ByVal b As Object) As Boolean 
     Return a.Obj Is b 
    End Operator 
    Public Shared Operator <>(ByVal a As IsWrapper, ByVal b As Object) As Boolean 
     Return a.Obj IsNot b 
    End Operator 
    End Structure 
End Module 

अब आप _is (AnyObject) का उपयोग कर सकते हैं:

Private Sub RbClass_CheckedChanged(sender As System.Object, e As System.EventArgs) 
    If DirectCast(sender, RadioButton).Checked = False Then Return 
    Select Case _Is(sender) 
     Case RbClass : Rb = 0 
     Case RbTablePredicate : Rb = 1 
     Case RbTableRowFilter : Rb = 2 
    End Select 
    QueryCtl1_QueryChanged(Nothing, Nothing) 
End Sub 

Public Sub Predicate(ByVal PredicateType As Type, ByVal Op As Operadores, ByVal Obj As Object, ByVal CompareOptions As CompareOptions, ByVal Fnc As [Delegate]) 
    Dim pred As [Delegate] = Nothing 
    Select Case _Is(PredicateType) 
     Case GetType(Boolean) 
      pred = New Predicate(Of Boolean)(Function(v) v) 
     Case GetType(String) 
      pred = StrPredicate(Op, Obj, CompareOptions) 
     Case Else 'Utilizar Generics 
      pred = GenericHelper.Builder(PredicateType).Predicate(Op, Obj) 
    End Select 
    Predicate(pred, Fnc) 
End Sub 

प्रदर्शन के बारे में। रिलीज कोड अनुकूलित है। रैपर का कोई प्रदर्शन जुर्माना नहीं है।

+0

अच्छा एक x77। ^^ – Hardryv

1

इस धागे को पढ़ने के बाद, ऐसा लगता है कि Select Case True के लिए प्राथमिक तर्क पठनीयता है। क्या यह पर्याप्त है? जब मैंने पहली बार VB.NET में इस तरह के निर्माण को देखा, तो मुझे यह सुनिश्चित करने के लिए कुछ बार पढ़ना पड़ा कि मुझे इसकी जानकारी मिल जाएगी, लेकिन अभी भी RolandTumble, above जैसी ही पंक्तियों के साथ सोचा था। तो यहां तक ​​कि पठनीयता भी थोड़ी सी कीमत पर आती है। हर कोई जानता है कि If...ElseIf...End If कथन क्या है और यह क्यों है। लघु सर्किटिंग AndAlso या OrElse का उपयोग करके सहायता प्राप्त की जा सकती है, और जटिलता कोड और कोडर में पूरी तरह से नीचे है।

यहां तक ​​कि If कथन अनुकूलित किए जा सकते हैं। स्पष्ट पूछने में क्या बात है (चाहे आपका value = True)। मैं एक बार एक सांकेतिक शब्दों में बदलनेवाला हमारे साथ काम करने से पूछा गया था कि क्या निम्नलिखित किया ...

Dim isVisible As Boolean 
.... 
If isVisible Then 
    .... 
End If 

Select Case True संरचना का प्रयोग भी लगता है जैसे आप वास्तविक Select Case लाइन से दूर ध्यान या तुलना जोर जा रहे हैं और Case कथन में, जैसा कि अजीब लगता है।

1

निर्माण का उपयोग करने का एक अन्य कारण चयन केस सत्य तब होता है जब आपके केस स्टेटमेंट एक बूलियन मान का मूल्यांकन करते हैं। चयन मामले में सभी मामलों को नियंत्रण के समान डेटा प्रकार का मूल्यांकन करने की आवश्यकता होती है। यदि आप स्ट्रिंग डेटा प्रकार को देख रहे हैं, तो सभी केस स्टेटमेंट्स को तार भी होना चाहिए।

SELECT CASE [string] 
CASE "String 1", "String 2" 
    [do a thing] 
CASE "String 3" 
    [do another thing] 
END SELECT 

लेकिन यदि आप तो अपने मामले डेटा प्रकार की तरह ऑपरेटर का उपयोग आंशिक स्ट्रिंग के तुलना कर रहे हैं बूलियन जो स्ट्रिंग नियंत्रण से मेल नहीं खाएगी हो जाता है। निम्नलिखित कोड काम नहीं करेगा:

SELECT CASE [string] 
CASE LIKE "*1", "*2" 
    [do a thing] 
CASE LIKE "*3" 
    [do another thing] 
END SELECT 

आदेश वाइल्डकार्ड का उपयोग करने के लिए (और इस प्रकार बूलियन मामले परिणामों है) आप एक बूलियन नियंत्रण मान होना करने के लिए है में, इस प्रकार संरचना की जरूरत है:

SELECT CASE TRUE 
CASE [string] LIKE "*1", "*2" 
    [do a thing] 
CASE [string] LIKE "*3" 
    [do another thing] 
END SELECT 

मैं

IF [string] LIKE "*1" AND [string] LIKE "*2" THEN 
    [do a thing] 
ELSEIF [string] LIKE "*3" 
    [do another thing] 
END IF 

निजी तौर पर मुझे लगता है का चयन मामले का उपयोग करें और पढ़ने के लिए जब वहाँ एक से अधिक तीन विकल्प हैं करने के लिए आसान है आप अगर इस्तेमाल कर सकते हैं लगता है ... elseif। मैं IF का उपयोग करता हूं ... ELSE और IF ... ELSEIF जब मुझे दो या तीन अलग-अलग विकल्पों (>, =, <) का मूल्यांकन करना है या यदि मैं 'मान्य' प्रविष्टियों की एक विशिष्ट श्रेणी के लिए मान का परीक्षण कर रहा हूं। यदि इसके बजाय प्रवेश में अधिक विविधता है और मुझे यह निर्धारित करने की आवश्यकता है कि कौन सी दस संभावनाएं हुई हैं, चयन केस का उपयोग करने के लिए एक बहुत ही आसान निर्माण है क्योंकि यह एकाधिक या कथन की आवश्यकता को समाप्त करता है।

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