Чи існує еквівалент 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 можна опустити. Це дозволяє викликати оператора, використовуючи лише два аргументи. Наступний список застосовується лише тоді, коли оператор 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
s):
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
і, ймовірно, є надмірним для того, що ви намагаєтеся перевірити, але це працює.
''' <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
/ ||
)
Return args.FirstOrDefault(Function(arg) arg IsNot Nothing)
:-)
Одне суттєве обмеження більшості цих рішень полягає в тому, що вони не матимуть короткого замикання. Тому вони насправді не рівнозначні ??
.
Вбудований If
оператор не буде оцінювати наступні параметри, якщо попередній параметр не дорівнює.
Наступні твердження рівнозначні:
C #
var value = expression1 ?? expression2 ?? expression3 ?? expression4;
В.Б.
dim value = if(expression1,if(expression2,if(expression3,expression4)))
Це буде працювати у всіх випадках, коли ??
працює. Будь-яке з інших рішень доведеться використовувати з особливою обережністю, оскільки вони легко запроваджують помилки під час роботи.
Перевірте документацію Microsoft про оператор If (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"))