जाहिर है इस VB6 और VBA शॉर्ट सर्किट करने के लिए एक तरह से हो सकता है और पहली सच मामले निष्पादित करने के लिए इस्तेमाल किया:चुनें प्रकरण सच
Select Case True
End Select
इस प्रयोग (VB.NET) में अब भी है?
जाहिर है इस VB6 और VBA शॉर्ट सर्किट करने के लिए एक तरह से हो सकता है और पहली सच मामले निष्पादित करने के लिए इस्तेमाल किया:चुनें प्रकरण सच
Select Case True
End Select
इस प्रयोग (VB.NET) में अब भी है?
में है यह वाक्य रचना अक्सर एक 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 में काम करता है। जब आप इसका इस्तेमाल करते हैं तो बस सावधानी बरतें, क्योंकि यह "मानक प्रोग्रामिंग निर्माण" नहीं है और यह उन लोगों से अपरिचित हो सकता है जिन्हें भविष्य में अपना कोड बनाए रखना है।
हां, वह वही है। धन्यवाद! –
क्या आपका ऐसा कुछ मतलब है?
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
मुझे यकीन है कि कैसे इस संरचना निम्नलिखित पर कोई लाभ प्रदान करता है नहीं कर रहा हूँ:
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
ऊपर संरचना है शॉर्ट सर्किट, और मैं बाहर काम करने के रूप में यह क्या करता है की कोशिश करने की जरूरत नहीं है एक मानक निर्माण।
ऐसा नहीं है, लेकिन कई वीबी प्रोग्रामर सबसे शुद्ध रूप से पठनीय प्रारूप के पक्ष में गलती करते हैं, और यह तर्क दिया जा सकता है कि प्रश्न वास्तव में उस स्थिति का वर्णन करता है। डेवलपर्स की अधिक सी-एस्क्यू विविधता निश्चित रूप से आपके शिविर में हैं। @ रोलैंड टम्बल भी देखें। – Hardryv
अन्य ने पहले से ही उस वास्तविक प्रश्न का उत्तर दिया है, लेकिन मैं बस इस बात का उपयोग करना चाहता हूं कि मैं इस निर्माण का काफी बार उपयोग करता हूं। मुझे लगता है कि यह अक्सर एक साथ दो बूलियन शर्तों परीक्षण के सबसे पठनीय तरीका है:
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
मैं क्यों मैं इसे आसानी से पढ़ने योग्य लगता है के उस भाग को स्वीकार करते हैं कि मैं इसका इस्तेमाल करते हैं, और मैं इसे पार्स करने के लिए होने याद है कि पहली बार मैंने इसे देखा - लेकिन एक बार सफलतापूर्वक पार्स किया गया, मेरी प्रतिक्रिया "वह शानदार है!"
इस विषय पर बहुत भ्रम है, लेकिन ओपीएस प्रश्न का उत्तर देने के लिए: हाँ, लॉजिकल मूल्यांकन 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
और बी नहीं चलेंगे। यह सिर्फ शैली का मामला है।
जानना महत्वपूर्ण बात यह है कि आप जो टालना चाहते हैं वह है एंड/या/एक्सर ऑपरेटर अगर-ब्लॉक नहीं हैं। यदि आपको इफ-ब्लॉक का चयन केस संस्करण बेहतर पसंद है ... आपको अधिक शक्ति :)
ध्यान दें कि आप OrElse को शॉर्ट-सर्किट में उपयोग कर सकते हैं और केवल ए – Jack
Select Case
a 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
आप किसी भी रैपर प्रकार पर बराबर ऑपरेटर को परिभाषित कर सकते हैं। फिर आप चयन केस पर रैपर प्रकार का उपयोग कर सकते हैं।
नमूना रैपर।
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
प्रदर्शन के बारे में। रिलीज कोड अनुकूलित है। रैपर का कोई प्रदर्शन जुर्माना नहीं है।
अच्छा एक x77। ^^ – Hardryv
इस धागे को पढ़ने के बाद, ऐसा लगता है कि 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
कथन में, जैसा कि अजीब लगता है।
निर्माण का उपयोग करने का एक अन्य कारण चयन केस सत्य तब होता है जब आपके केस स्टेटमेंट एक बूलियन मान का मूल्यांकन करते हैं। चयन मामले में सभी मामलों को नियंत्रण के समान डेटा प्रकार का मूल्यांकन करने की आवश्यकता होती है। यदि आप स्ट्रिंग डेटा प्रकार को देख रहे हैं, तो सभी केस स्टेटमेंट्स को तार भी होना चाहिए।
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 जब मुझे दो या तीन अलग-अलग विकल्पों (>, =, <) का मूल्यांकन करना है या यदि मैं 'मान्य' प्रविष्टियों की एक विशिष्ट श्रेणी के लिए मान का परीक्षण कर रहा हूं। यदि इसके बजाय प्रवेश में अधिक विविधता है और मुझे यह निर्धारित करने की आवश्यकता है कि कौन सी दस संभावनाएं हुई हैं, चयन केस का उपयोग करने के लिए एक बहुत ही आसान निर्माण है क्योंकि यह एकाधिक या कथन की आवश्यकता को समाप्त करता है।
इस 'चयन केस' हैक की बजाय वीबीएनईटी में 'एंडअल्सो' और 'ऑरलेस' शॉर्ट-सर्किटिंग ऑपरेटरों का उपयोग करें। –