Apakah ada VB.NET yang setara untuk ??
operator C # ?
Apakah ada VB.NET yang setara untuk ??
operator C # ?
Jawaban:
Gunakan If()
operator dengan dua argumen ( dokumentasi 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()
pernyataan dalam VB sama dengan if...?...:
di C #, bukan ??
operator
??
(lihat jawaban lain untuk pertanyaan ini: stackoverflow.com/a/20686360/1474939 )
If
dengan tiga parameter . Itu tidak mirip dengan ??
operator C # . Jawaban yang lebih baik adalah Kode Maverick Jika dengan dua argumen . (Nick memiliki jawaban yang sama, bertahun-tahun sebelumnya, tetapi tidak termasuk penjelasan dari MSDN.)
The IF()
Operator harus melakukan trik untuk Anda:
value = If(nullable, defaultValueIfNull)
Jawaban yang diterima tidak memiliki penjelasan apa pun dan hanya berupa tautan.
Oleh karena itu, saya pikir saya akan meninggalkan jawaban yang menjelaskan cara kerja If
operator diambil dari MSDN:
Menggunakan evaluasi hubung singkat untuk mengembalikan satu dari dua nilai secara kondisional. The Jika operator dapat disebut dengan tiga argumen atau dengan dua argumen.
If( [argument1,] argument2, argument3 )
Argumen pertama ke Jika bisa dihilangkan. Ini memungkinkan operator dipanggil dengan hanya menggunakan dua argumen. Daftar berikut ini hanya berlaku ketika operator If dipanggil dengan dua argumen.
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.
Ketika argumen Boolean dihilangkan, argumen pertama harus berupa tipe referensi atau nullable. Jika argumen pertama mengevaluasi ke Nothing , nilai argumen kedua dikembalikan. Dalam semua kasus lain, nilai argumen pertama dikembalikan. Contoh berikut menggambarkan cara kerja evaluasi ini.
' 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))
Contoh cara menangani lebih dari dua nilai (bersarang 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)))
Anda dapat menggunakan metode ekstensi. Yang ini bekerja seperti SQL COALESCE
dan mungkin berlebihan untuk apa yang Anda coba untuk menguji, tetapi berhasil.
''' <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
Built-in If(nullable, secondChoice)
hanya dapat menangani dua pilihan yang dapat dibatalkan. Di sini, satu Coalesce
parameter dapat sebanyak yang diinginkan. Yang bukan-nol pertama akan dikembalikan, dan parameter lainnya tidak dievaluasi setelah itu (dihubung pendek, seperti AndAlso
/ &&
dan OrElse
/ ||
)
Return args.FirstOrDefault(Function(arg) arg IsNot Nothing)
:-)
Satu batasan signifikan dari sebagian besar solusi ini adalah mereka tidak akan mengalami hubungan pendek. Karena itu mereka sebenarnya tidak setara dengan ??
.
Built-in If
Operator tidak akan mengevaluasi parameter berikutnya kecuali mengevaluasi parameter sebelumnya untuk apa-apa.
Pernyataan berikut ini setara:
C #
var value = expression1 ?? expression2 ?? expression3 ?? expression4;
VB
dim value = if(expression1,if(expression2,if(expression3,expression4)))
Ini akan berfungsi dalam semua kasus di mana ??
bekerja. Salah satu solusi lain harus digunakan dengan sangat hati-hati, karena mereka dapat dengan mudah memperkenalkan bug run-time.
Periksa dokumentasi Microsoft tentang If Operator (Visual Basic) di sini: https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/operators/if-operator
If( [argument1,] argument2, argument3 )
Berikut adalah beberapa contoh (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"))