Есть ли VB.NET-эквивалент для C # 's' ?? ' оператор?

164

Существует ли эквивалент VB.NET для оператора С# ???

  • 4
    Большинство ответов здесь (включая принятый ответ) не являются правильными и не являются функционально эквивалентными во всех ситуациях. Правильный эквивалент - оператор if () с 2 аргументами. Однако второй аргумент может быть вложенным для достижения точно таких же результатов, как с несколькими аргументами.
Теги:
operators
null-coalescing-operator

6 ответов

135
Лучший ответ

Используйте оператор 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))
  • 0
    IF - оператор объединения в VB
  • 3
    Я думаю, что оператор If() в VB такой же, как if...?...: в C #, а не ?? оператор
Показать ещё 5 комментариев
106

Оператор IF() должен сделать трюк для вас:

value = If(nullable, defaultValueIfNull)

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

  • 3
    Ссылка (эффективно) не работает.
  • 0
    Более поздний ответ Code Maverick дает объяснение MSDN и более подробные примеры.
64

Принятый ответ не имеет никакого объяснения и просто является ссылкой.
Поэтому я думал, что оставлю ответ, объясняющий, как оператор If работает с MSDN:


Если оператор (Visual Basic)

Использует оценку короткого замыкания, чтобы условно вернуть один из двух значения. Оператор 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.


Когда аргумент Boolean опущен, первый аргумент должен быть ссылочный или нулевой тип. Если первый аргумент оценивается Ничего, возвращается значение второго аргумента. Во всех остальных случаях возвращается значение первого аргумента. следующий пример иллюстрирует, как эта оценка работает.


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

Вы можете использовать метод расширения. Это работает как 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/||)

  • 8
    Потому что в языке есть встроенный оператор. Нет причин даже смотреть на методы расширения.
  • 2
    Я не собираюсь повторять чужой ответ. Я подумал, что было бы неплохо предложить альтернативное решение, если вам нужно проверить несколько значений одним оператором. Так как это не НЕПРАВИЛЬНЫЙ ответ, то должно ли оно быть понижено?
Показать ещё 9 комментариев
9

Единственным существенным ограничением большинства этих решений является то, что они не будут замыкаться. Поэтому они фактически не эквивалентны

Встроенный оператор "if" не будет оценивать последующие параметры, если только более ранний параметр не имеет значения.

Следующие утверждения эквивалентны.

С#

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

VB

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

Это будет работать во всех случаях, когда "??" работает. Любые другие решения должны использоваться с особой осторожностью, поскольку они могут легко вводить ошибки времени выполнения.

  • 0
    Это не работает в тех случаях, когда существует неизвестное количество параметров (ну ... не без использования roslyn или codedom для предварительной компиляции оператора, чтобы соответствовать количеству параметров в тот момент в выполнении).
  • 0
    @StingyJack Это не предназначено для. Это делает именно то, что ?? оператор делает.
Показать ещё 1 комментарий
2

Ознакомьтесь с документацией Microsoft о том, есть ли здесь 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
    Ницца! Удаление комментария!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню