क्या C # 's' के लिए VB.NET बराबर है? '' ऑपरेटर?


180

क्या C # के ??ऑपरेटर के लिए VB.NET बराबर है ?


4
यहाँ अधिकांश उत्तर (स्वीकृत उत्तर सहित) सही नहीं हैं, और कार्यात्मक रूप से इसके समकक्ष नहीं हैं ?? सभी स्थितियों में। सही तर्क 2 तर्कों के साथ if () कथन है। दूसरा तर्क हालांकि वास्तव में एक ही परिणाम प्राप्त करने के लिए नेस्टेड हो सकता है ?? कई तर्कों के साथ।
user1751825

आप त्रिगुट ऑपरेटर मतलब है:: जैसे वापसी (झूठी (मूल्य <0) सच?)?
Zeek2

जवाबों:


155

If()दो तर्क ( Microsoft प्रलेखन ) वाले ऑपरेटर का उपयोग करें :

' Variable first is a nullable type.
Dim first? As Integer = 3
Dim second As Integer = 6

' Variable first <> Nothing, so its value, 3, is returned.
Console.WriteLine(If(first, second))

second = Nothing
' Variable first <> Nothing, so the value of first is returned again. 
Console.WriteLine(If(first, second))

first = Nothing second = 6
' Variable first = Nothing, so 6 is returned.
Console.WriteLine(If(first, second))

3
मुझे लगता है कि If()VB में कथन if...?...:C # के समान है, ??ऑपरेटर नहीं
ल्यूक T O'Brien

2
@ LucTO'Brien अगर आप इसे 3 तर्कों के साथ उपयोग करते हैं। यदि आप इसे 2 तर्कों के साथ उपयोग करते हैं, तो यह अधिक है ??(इस प्रश्न का एक और उत्तर देखें: stackoverflow.com/a/20686360/1474939 )
ब्रायन जे

2
यह उत्तर दिखाता है कि If तीन मापदंडों के साथ वीबी का उपयोग कैसे करें । यह C # के ऑपरेटर के समान नहीं है??दो तर्कों के साथ बेहतर जवाब है कोड मैवरिक इफ । (निक का एक समान उत्तर था, वर्षों पहले, लेकिन MSDN से स्पष्टीकरण शामिल नहीं करता है।)
टूलमेकर

1
यह एक पूरी तरह से अलग सवाल का जवाब देता है।
मार्क Gravell

1
पिछली टिप्पणियों को समझने के लिए, संपादन इतिहास को देखें।
ज़ेव स्पिट्ज

105

IF()ऑपरेटर आप के लिए चाल करना चाहिए:

value = If(nullable, defaultValueIfNull)

http://visualstudiomagazine.com/listings/list.aspx?id=252


3
लिंक (प्रभावी रूप से) टूटा हुआ है।
पीटर मोर्टेंसन

कोड मेवरिक का बाद का उत्तर MSDN स्पष्टीकरण और अधिक विस्तृत उदाहरण देता है।
टूलमेकर

70

स्वीकृत जवाब में कोई स्पष्टीकरण नहीं है और यह केवल एक लिंक है।
इसलिए, मैंने सोचा कि मैं एक उत्तर छोड़ दूंगा जो बताता है कि Ifऑपरेटर MSDN से कैसे काम करता है:


यदि ऑपरेटर (विजुअल बेसिक)

सशर्त रूप से दो मानों में से एक को वापस करने के लिए शॉर्ट-सर्किट मूल्यांकन का उपयोग करता है। यदि ऑपरेटर तीन तर्क के साथ या दो तर्क के साथ कहा जा सकता है।

If( [argument1,] argument2, argument3 )


यदि संचालक दो तर्क के साथ बुलाए गए

If करने के लिए पहला तर्क छोड़ा जा सकता है। यह ऑपरेटर को केवल दो तर्कों का उपयोग करके कॉल करने में सक्षम बनाता है। निम्न सूची लागू होता है जब यदि ऑपरेटर दो तर्कों कहा जाता है।


पार्ट्स

Term         Definition
----         ----------

argument2    Required. Object. Must be a reference or nullable type. 
             Evaluated and returned when it evaluates to anything 
             other than Nothing.

argument3    Required. Object.
             Evaluated and returned if argument2 evaluates to Nothing.


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


वीबी

' Variable first is a nullable type. 
Dim first? As Integer = 3
Dim second As Integer = 6

' Variable first <> Nothing, so its value, 3, is returned.
Console.WriteLine(If(first, second))

second = Nothing 
' Variable first <> Nothing, so the value of first is returned again.
Console.WriteLine(If(first, second))

first = Nothing
second = 6
' Variable first = Nothing, so 6 is returned.
Console.WriteLine(If(first, second))

दो से अधिक मानों को कैसे प्रबंधित किया जाए (nested ifs) का एक उदाहरण :

Dim first? As Integer = Nothing
Dim second? As Integer = Nothing
Dim third? As Integer = 6
' The LAST parameter doesn't have to be nullable.
'Alternative: Dim third As Integer = 6

' Writes "6", because the first two values are "Nothing".
Console.WriteLine(If(first, If(second, third)))

18

आप एक एक्सटेंशन विधि का उपयोग कर सकते हैं। यह एक एसक्यूएल की तरह काम करता है COALESCEऔर संभवतः आप जो परीक्षण करने की कोशिश कर रहे हैं उसके लिए ओवरकिल है, लेकिन यह काम करता है।

    ''' <summary>
    ''' Returns the first non-null T based on a collection of the root object and the args.
    ''' </summary>
    ''' <param name="obj"></param>
    ''' <param name="args"></param>
    ''' <returns></returns>
    ''' <remarks>Usage
    ''' Dim val as String = "MyVal"
    ''' Dim result as String = val.Coalesce(String.Empty)
    ''' *** returns "MyVal"
    '''
    ''' val = Nothing
    ''' result = val.Coalesce(String.Empty, "MyVal", "YourVal")
    ''' *** returns String.Empty
    '''
    ''' </remarks>
    <System.Runtime.CompilerServices.Extension()> _
    Public Function Coalesce(Of T)(ByVal obj As T, ByVal ParamArray args() As T) As T

        If obj IsNot Nothing Then
            Return obj
        End If

        Dim arg As T
        For Each arg In args
            If arg IsNot Nothing Then
                Return arg
            End If
        Next

        Return Nothing

    End Function

बिल्ट-इन If(nullable, secondChoice)केवल दो अशक्त विकल्प को संभाल सकता है । यहाँ, एक Coalesceवांछित के रूप में कई मापदंडों हो सकता है । पहले गैर-शून्य से एक वापस कर दी जाएगी, और पैरामीटर के बाकी उसके बाद (शॉर्ट सर्किट, जैसे मूल्यांकन नहीं किया जाता AndAlso/ &&और OrElse/ ||)


8
क्योंकि भाषा में बिल्ट इन ऑपरेटर होता है। विस्तार के तरीकों को देखने का कोई कारण भी नहीं।
निक

2
मैं किसी और के जवाब को दोहराने नहीं जा रहा हूं। मुझे लगा कि यदि आपको एक कथन के साथ कई मानों की जाँच करने की आवश्यकता है, तो एक वैकल्पिक समाधान प्रदान करना अच्छा हो सकता है। चूंकि इसका गलत जवाब नहीं है, तो क्या इसे ठुकरा दिया जाना चाहिए?
स्टिंगजैक

1
जेनेरिक का उपयोग करते हुए एक कार्यान्वयन प्रदान करने और टाइप कास्टिंग / बॉक्सिंग /
अनबॉक्सिंग

4
@ अच्छा, क्षमा करें, लेकिन आप सीधे सादे गलत हैं। यदि आपके पास दो से अधिक मोटे तर्क हैं, तो अंतर्निहित फ़ंक्शन इसे काट नहीं करेगा।
टोडडोमो

आप obj param को छोड़ सकते हैं और शरीर को Return args.FirstOrDefault(Function(arg) arg IsNot Nothing):-)
Ulf tkerstedt

11

इनमें से अधिकांश समाधानों की एक महत्वपूर्ण सीमा यह है कि वे शॉर्ट-सर्किट नहीं करेंगे। इसलिए वे वास्तव में इसके समकक्ष नहीं हैं ??

अंतर्निहित Ifऑपरेटर बाद के मापदंडों का मूल्यांकन नहीं करेगा जब तक कि पहले वाला पैरामीटर कुछ भी नहीं का मूल्यांकन करता है।

निम्न कथन समतुल्य हैं:

सी#

var value = expression1 ?? expression2 ?? expression3 ?? expression4;

वीबी

dim value = if(expression1,if(expression2,if(expression3,expression4)))

यह उन सभी मामलों में काम करेगा जहां ??काम करता है। किसी भी अन्य समाधान को अत्यधिक सावधानी के साथ उपयोग करना होगा, क्योंकि वे आसानी से रन-टाइम बग का परिचय दे सकते हैं।


यह उन मामलों में काम नहीं करता है जहां अज्ञात संख्या में पैरामीटर हैं (अच्छी तरह से .. निष्पादन में उस समय मापदंडों की संख्या से मेल खाने के लिए कथन को precompile करने के लिए रोसलिन या कोडडम का उपयोग किए बिना नहीं)।
स्टिंगजैक

@StingyJack यह करने का इरादा नहीं है। यह वास्तव में क्या करता है ?? ऑपरेटर करता है।
user1751825

2

यदि ऑपरेटर (विजुअल बेसिक) के बारे में Microsoft दस्तावेज़ यहाँ देखें: https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/operators/if-operator

If( [argument1,] argument2, argument3 )

यहाँ कुछ उदाहरण हैं (VB.Net)

' This statement prints TruePart, because the first argument is true.
Console.WriteLine(If(True, "TruePart", "FalsePart"))

' This statement prints FalsePart, because the first argument is false.
Console.WriteLine(If(False, "TruePart", "FalsePart"))

Dim number = 3
' With number set to 3, this statement prints Positive.
Console.WriteLine(If(number >= 0, "Positive", "Negative"))

number = -1
' With number set to -1, this statement prints Negative.
Console.WriteLine(If(number >= 0, "Positive", "Negative"))

1
अच्छा! टिप्पणी निकाल रहा हूँ!
एलेक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.