সি # 'এর' এর জন্য কোনও ভিবি.এনইটি সমতুল্য কি ?? ' অপারেটর?


180

সি # এর ??অপারেটরের জন্য কি কোনও ভিবি.এনইটি সমতুল্য ?


4
এখানে বেশিরভাগ উত্তর (স্বীকৃত উত্তর সহ) সঠিক নয়, এবং কার্যকরীভাবে সমান নয় ?? সব পরিস্থিতিতে। সঠিক সমতুল্য 2 টি যুক্তিযুক্ত if () বিবৃতি। দ্বিতীয় যুক্তিটি ঠিক ঠিক একই ফলাফল অর্জনের জন্য বাসা বাঁধতে পারে ?? একাধিক যুক্তি সহ।
ব্যবহারকারী1751825

আপনি কি টার্নারি অপারেটর বলতে চান
?:

উত্তর:


154

If()দুটি আর্গুমেন্ট ( মাইক্রোসফ্ট ডকুমেন্টেশন ) সহ অপারেটরটি ব্যবহার করুন :

' 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()ভিবিতে বিবৃতিটি if...?...:সি # তে সমান , ??অপারেটর নয়
লুক টি ও'ব্রায়েন

2
@ লুক্টো ব্রায়েন এটি যদি আপনি 3 টি যুক্তি দিয়ে ব্যবহার করেন। আপনি যদি এটি 2 টি যুক্তি দিয়ে ব্যবহার করেন তবে এটি আরও বেশি ??(এই প্রশ্নের আরও উত্তর দেখুন: stackoverflow.com/a/20686360/1474939 )
ব্রায়ান জে

2
এই উত্তরটি If তিনটি পরামিতি সহ ভিবি কীভাবে ব্যবহার করবেন তা দেখায় । যে না সি # 'গুলি অনুরূপ ??অপারেটর। দুটি যুক্তি সহ উত্তরের উত্তর হ'ল কোড মাভেরিকের ইফ । (নিকের একই উত্তর ছিল, বছর আগে, কিন্তু এমএসডিএন থেকে ব্যাখ্যাটি অন্তর্ভুক্ত নয়।)
টুলমেকারস্টিভ

1
এটি সম্পূর্ণ ভিন্ন প্রশ্নের উত্তর দেয়।
মার্ক গ্র্যাভেল

1
পূর্ববর্তী মন্তব্যগুলি বুঝতে, সম্পাদনার ইতিহাসটি দেখুন।
জেভ স্পিটজ

105

IF()অপারেটর তোমার জন্য কৌতুক করতে হবে:

value = If(nullable, defaultValueIfNull)

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


3
লিঙ্কটি (কার্যকরভাবে) নষ্ট হয়ে গেছে।
পিটার মর্টেনসেন

কোড মাভেরিকের পরবর্তী উত্তরগুলি এমএসডিএন ব্যাখ্যা এবং আরও বিশদ উদাহরণ দেয়।
টুলমেকারস্টেভ

70

গৃহীত উত্তরের কোনও ব্যাখ্যা নেই এবং এটি কেবল একটি লিঙ্ক।
অতএব, আমি ভেবেছিলাম আমি এমন একটি উত্তর রেখে যাব যা Ifএমএসডিএন থেকে অপারেটর কীভাবে কাজ করে তা ব্যাখ্যা করে :


যদি অপারেটর (ভিজ্যুয়াল বেসিক)

শর্তসাপেক্ষে দুটি মানগুলির মধ্যে একটিকে ফেরত দিতে শর্ট সার্কিট মূল্যায়ন ব্যবহার করে। তাহলে অপারেটর তিনটি আর্গুমেন্ট সহ বা দুই আর্গুমেন্ট সহ বলা যায় না।

If( [argument1,] argument2, argument3 )


অপারেটর যদি দুটি তর্ক সঙ্গে কল করা হয়

যদি প্রথম যুক্তি বাদ দেওয়া যেতে পারে। এটি অপারেটরটিকে মাত্র দুটি যুক্তি ব্যবহার করে কল করতে সক্ষম করে। নিম্নলিখিত তালিকা প্রযোজ্য শুধুমাত্র যখন এমন অপারেটর দুই আর্গুমেন্ট সহ বলা হয়।


পার্টস

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))

কীভাবে দুটিরও বেশি মান (নেস্টেড if) হ্যান্ডেল করা যায় তার একটি উদাহরণ :

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)পরিচালনা করতে পারে । এখানে, একটি হিসাবে কাঙ্ক্ষিত হিসাবে অনেক পরামিতি করতে পারেন । প্রথম অ-নাল একটি ফিরে আসবে এবং বাকী প্যারামিটারগুলি তার পরে মূল্যায়ন করা হবে না (সংক্ষিপ্ত সার্কিট, যেমন / এবং / )CoalesceAndAlso&&OrElse||


8
কারণ ভাষার অপারেটর রয়েছে। এমনকি এক্সটেনশন পদ্ধতিগুলি দেখার কোনও কারণ নেই।
নিক

2
আমি অন্য কারও উত্তর পুনরাবৃত্তি করতে যাচ্ছি না। আমি অনুভব করেছি যে আপনার যদি একক বিবৃতি দিয়ে একাধিক মান পরীক্ষা করতে হয় তবে একটি বিকল্প সমাধান প্রদান করা ভাল। যেহেতু এটি কোনও ভুল উত্তর নয়, তা হলে এটি কী নিম্নচালিত হওয়া উচিত?
স্টিংজি জ্যাক


4
@ নিক, দুঃখিত, তবে আপনি ঠিক সরল ভুল। আপনার যদি দুটিরও বেশি কোলেসেস আর্গুমেন্ট থাকে তবে বিল্ট ইন ফাংশনটি এটি কাটবে না।
টুডমো

আপনি Return args.FirstOrDefault(Function(arg) arg IsNot Nothing)
আপত্তিটি পরমকে

11

এর বেশিরভাগ সমাধানগুলির মধ্যে একটি উল্লেখযোগ্য সীমাবদ্ধতা হ'ল তারা শর্ট সার্কিট করবে না। তারা আসলে সমতুল্য নয় ??

Ifপূর্ববর্তী প্যারামিটারটি কিছু না মূল্যায়ন না করে বিল্ট-ইন অপারেটর পরবর্তী পরামিতিগুলির মূল্যায়ন করবে না।

নিম্নলিখিত বিবৃতি সমতুল্য:

সি শার্প

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

ভিবি

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

যেখানে ??কাজ করে সেখানে এটি কাজ করবে। অন্যান্য সমাধানগুলির যে কোনওটি চূড়ান্ত সতর্কতার সাথে ব্যবহার করতে হবে, কারণ তারা সহজেই রান-টাইম বাগগুলি প্রবর্তন করতে পারে।


This does not work in cases where there are an unknown number of parameters (well.. not without using roslyn or codedom to precompile a statement to match the number of parameters at that moment in the execution).
StingyJack

@StingyJack It's not intended to. It does exactly what the ?? operator does.
user1751825

2

Check Microsoft documentation about If Operator (Visual Basic) here: https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/operators/if-operator

If( [argument1,] argument2, argument3 )

Here are some examples (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
Nice! Removing comment!
Alec
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.