Вопрос

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

Это было полезно?

Решение

Использовать If() оператор с двумя аргументами (Документация Майкрософт):

' 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() оператор должен сделать это за вас:

value = If(nullable, defaultValueIfNull)

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

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


Оператор If (Visual Basic)

Использует оценку короткого замыкания для условного возврата одного из двух значений.А Если Оператор может быть вызван с тремя аргументами или двумя аргументами.

If( [argument1,] argument2, argument3 )


Если оператор вызван с двумя аргументами

Первый аргумент для Если можно опустить.Это позволяет вызову оператора с помощью только двух аргументов.В следующем списке применяется только тогда, когда Если оператор вызывается с двумя аргументами.


Части

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 и, вероятно, это излишне для того, что вы пытаетесь протестировать, но это работает.

    ''' <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/|| )

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

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

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

С#

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

ВБ

dim value = if(exression1,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"))
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top