มี VB.NET ที่เทียบเท่ากับ C # 's' หรือไม่? ผู้ประกอบการ?


180

มี VB.NET ที่เทียบเท่ากันสำหรับ??โอเปอเรเตอร์ของ C # หรือไม่


4
คำตอบส่วนใหญ่ที่นี่ (รวมถึงคำตอบที่ยอมรับ) ไม่ถูกต้องและไม่เทียบเท่ากับ ในทุกสถานการณ์ การเทียบเท่าที่ถูกต้องคือคำสั่ง if () ที่มี 2 อาร์กิวเมนต์ อาร์กิวเมนต์ที่สองอย่างไรก็ตามสามารถซ้อนเพื่อให้ได้ผลลัพธ์เช่นเดียวกับ ด้วยข้อโต้แย้งหลาย ๆ
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 # ไม่ใช่ตัว??ดำเนินการ
Luke T O'Brien

2
@ LukeTO'Brien นั่นคือถ้าคุณใช้กับ 3 ข้อโต้แย้ง หากคุณใช้กับ 2 อาร์กิวเมนต์มันเป็นมากกว่านั้น??(ดูคำตอบอื่นสำหรับคำถามนี้: stackoverflow.com/a/20686360/1474939 )
Brian J

2
คำตอบนี้แสดงวิธีใช้ VB If กับพารามิเตอร์สามตัว ที่ไม่เหมือนกับ??โอเปอเรเตอร์ของ C # คำตอบที่ดีกว่าคือถ้ารหัสไม่ฝักใฝ่ฝ่ายใดที่มีสองข้อโต้แย้ง (นิคมีคำตอบที่คล้ายกันเมื่อหลายปีก่อน แต่ไม่รวมคำอธิบายจาก MSDN)
ToolmakerSteve

1
คำตอบนี้เป็นคำถามที่แตกต่างอย่างสิ้นเชิง
Marc Gravell

1
เพื่อทำความเข้าใจความคิดเห็นก่อนหน้านี้ดูที่ประวัติการแก้ไข
Zev Spitz

105

IF()ผู้ประกอบการควรทำเคล็ดลับสำหรับคุณ:

value = If(nullable, defaultValueIfNull)

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


3
ลิงก์เสีย (มีประสิทธิภาพ)
Peter Mortensen

คำตอบของผู้ไม่ฝักใฝ่ฝ่ายใดของ Codeให้คำอธิบาย MSDN และตัวอย่างรายละเอียดเพิ่มเติม
ToolmakerSteve

70

คำตอบที่ยอมรับไม่มีคำอธิบายใด ๆ และเป็นเพียงแค่ลิงค์
ดังนั้นฉันคิดว่าฉันออกจากคำตอบที่อธิบายวิธีIfการทำงานของผู้ดำเนินการจาก MSDN:


ถ้าผู้ประกอบการ (Visual Basic)

ใช้การประเมินการลัดวงจรเพื่อคืนค่าหนึ่งในสองค่าตามเงื่อนไข ตัวดำเนินการIfสามารถเรียกได้ด้วยสามข้อโต้แย้งหรือสองข้อโต้แย้ง

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.


เมื่อละเว้นการบูลีนอาร์กิวเมนต์แรกจะต้องเป็นการอ้างอิงหรือเป็นโมฆะชนิด ถ้าอาร์กิวเมนต์แรกประเมินค่าเป็น ไม่มีอะไรค่าของอาร์กิวเมนต์ที่สองจะถูกส่งคืน ในกรณีอื่น ๆ ทั้งหมดค่าของอาร์กิวเมนต์แรกจะถูกส่งกลับ ตัวอย่างต่อไปนี้แสดงให้เห็นว่าการประเมินผลนี้ทำงานอย่างไร


VB

' 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

คุณสามารถใช้วิธีการขยาย อันนี้ทำงานเหมือน SQL COALESCEและอาจ overkill สำหรับสิ่งที่คุณพยายามทดสอบ แต่ใช้งานได้

    ''' <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)สามารถจัดการตัวเลือก nullable สองตัวเท่านั้น ที่นี่หนึ่งสามารถCoalesceพารามิเตอร์ได้มากเท่าที่ต้องการ คนแรกที่ไม่เป็นโมฆะจะถูกส่งกลับและส่วนที่เหลือของพารามิเตอร์จะไม่ได้รับการประเมินหลังจากนั้น (ลัดวงจรเช่นAndAlso/&&และOrElse/ ||)


8
เนื่องจากภาษามีตัวดำเนินการในตัว ไม่มีเหตุผลที่จะดูวิธีการขยาย
นิค

2
ฉันจะไม่ตอบคำตอบของคนอื่นซ้ำ ฉันคิดว่ามันอาจจะดีที่จะให้ทางออกทางเลือกถ้าคุณต้องการตรวจสอบค่าหลายค่าด้วยคำสั่งเดียว เนื่องจากไม่ใช่คำตอบที่ไม่ถูกต้องมันควรถูกลดระดับลงหรือไม่
StingyJack

1
+1 สำหรับการนำเสนอการดำเนินการโดยใช้ข้อมูลทั่วไปและหลีกเลี่ยงการคัดเลือกนักแสดง / มวย / unboxing
ulty4life

4
@Nick ขออภัย แต่คุณผิดธรรมดา หากคุณมีอาร์กิวเมนต์รวมกันมากกว่าสองรายการฟังก์ชันที่มีอยู่แล้วจะไม่ตัดทิ้ง
toddmo

คุณสามารถข้าม obj param และปล่อยให้ร่างกายเป็นReturn args.FirstOrDefault(Function(arg) arg IsNot Nothing):-)
Ulf Åkerstedt

11

ข้อ จำกัด ที่สำคัญอย่างหนึ่งของโซลูชั่นเหล่านี้ส่วนใหญ่คือพวกเขาจะไม่เกิดไฟฟ้าลัดวงจร ??พวกเขาจึงไม่จริงเทียบเท่ากับ

ตัวIfดำเนินการในตัวจะไม่ประเมินพารามิเตอร์ที่ตามมายกเว้นว่าพารามิเตอร์ก่อนหน้านี้ประเมินเป็นอะไร

ข้อความต่อไปนี้เทียบเท่า:

ค#

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

VB

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

สิ่งนี้จะใช้ได้ในทุกกรณีที่ใช้??งานได้ การแก้ปัญหาอื่น ๆ จะต้องใช้ด้วยความระมัดระวังอย่างยิ่งเนื่องจากพวกเขาสามารถแนะนำบั๊กแบบรันไทม์ได้อย่างง่ายดาย


สิ่งนี้ใช้ไม่ได้ในกรณีที่มีจำนวนพารามิเตอร์ที่ไม่รู้จัก (เช่น .. ไม่ได้โดยไม่ใช้โรสลินหรือ codedom เพื่อคอมไพล์คำสั่งล่วงหน้าเพื่อให้ตรงกับจำนวนพารามิเตอร์ในขณะนั้นในการดำเนินการ)
StingyJack

@StingyJack มันไม่ได้ตั้งใจที่จะ มันทำในสิ่งที่? ผู้ประกอบการไม่
user1751825

2

ตรวจสอบเอกสารประกอบของ Microsoft เกี่ยวกับ If Operator (Visual Basic) ที่นี่: 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
ดี! กำลังลบความคิดเห็น!
อเล็กซ์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.