มี VB.NET ที่เทียบเท่ากันสำหรับ??
โอเปอเรเตอร์ของ C # หรือไม่
มี VB.NET ที่เทียบเท่ากันสำหรับ??
โอเปอเรเตอร์ของ C # หรือไม่
คำตอบ:
ใช้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))
If()
คำสั่งใน VB นั้นเหมือนกับif...?...:
ใน C # ไม่ใช่ตัว??
ดำเนินการ
??
(ดูคำตอบอื่นสำหรับคำถามนี้: stackoverflow.com/a/20686360/1474939 )
If
กับพารามิเตอร์สามตัว ที่ไม่เหมือนกับ??
โอเปอเรเตอร์ของ C # คำตอบที่ดีกว่าคือถ้ารหัสไม่ฝักใฝ่ฝ่ายใดที่มีสองข้อโต้แย้ง (นิคมีคำตอบที่คล้ายกันเมื่อหลายปีก่อน แต่ไม่รวมคำอธิบายจาก MSDN)
IF()
ผู้ประกอบการควรทำเคล็ดลับสำหรับคุณ:
value = If(nullable, defaultValueIfNull)
คำตอบที่ยอมรับไม่มีคำอธิบายใด ๆ และเป็นเพียงแค่ลิงค์
ดังนั้นฉันคิดว่าฉันออกจากคำตอบที่อธิบายวิธีIf
การทำงานของผู้ดำเนินการจาก MSDN:
ใช้การประเมินการลัดวงจรเพื่อคืนค่าหนึ่งในสองค่าตามเงื่อนไข ตัวดำเนินการ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.
เมื่อละเว้นการบูลีนอาร์กิวเมนต์แรกจะต้องเป็นการอ้างอิงหรือเป็นโมฆะชนิด ถ้าอาร์กิวเมนต์แรกประเมินค่าเป็น ไม่มีอะไรค่าของอาร์กิวเมนต์ที่สองจะถูกส่งคืน ในกรณีอื่น ๆ ทั้งหมดค่าของอาร์กิวเมนต์แรกจะถูกส่งกลับ ตัวอย่างต่อไปนี้แสดงให้เห็นว่าการประเมินผลนี้ทำงานอย่างไร
' 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)))
คุณสามารถใช้วิธีการขยาย อันนี้ทำงานเหมือน 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
/ ||
)
Return args.FirstOrDefault(Function(arg) arg IsNot Nothing)
:-)
ข้อ จำกัด ที่สำคัญอย่างหนึ่งของโซลูชั่นเหล่านี้ส่วนใหญ่คือพวกเขาจะไม่เกิดไฟฟ้าลัดวงจร ??
พวกเขาจึงไม่จริงเทียบเท่ากับ
ตัวIf
ดำเนินการในตัวจะไม่ประเมินพารามิเตอร์ที่ตามมายกเว้นว่าพารามิเตอร์ก่อนหน้านี้ประเมินเป็นอะไร
ข้อความต่อไปนี้เทียบเท่า:
ค#
var value = expression1 ?? expression2 ?? expression3 ?? expression4;
VB
dim value = if(expression1,if(expression2,if(expression3,expression4)))
สิ่งนี้จะใช้ได้ในทุกกรณีที่ใช้??
งานได้ การแก้ปัญหาอื่น ๆ จะต้องใช้ด้วยความระมัดระวังอย่างยิ่งเนื่องจากพวกเขาสามารถแนะนำบั๊กแบบรันไทม์ได้อย่างง่ายดาย
ตรวจสอบเอกสารประกอบของ 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"))