C # 's' için bir VB.NET eşdeğeri var mı ?? ' Şebeke?


180

C # ??operatörü için bir VB.NET eşdeğeri var mı ?


4
Buradaki cevapların çoğu (kabul edilen cevap dahil) doğru değildir ve işlevsel olarak ?? her durumda. Doğru eşdeğer, 2 bağımsız değişkeni olan if () ifadesidir. Bununla birlikte, ikinci argüman tam olarak aynı sonuçları elde etmek için yuvalanabilir. birden çok argüman ile.
user1751825

Üçlü operatör mü demek istediniz?: Eg return ((değer <0)? True: false)
Zeek2

Yanıtlar:


155

If()İşleci iki bağımsız değişkenle kullanın ( Microsoft belgeleri ):

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

3
Bence If()VB'deki açıklama if...?...:C # ile aynı , ??operatör değil
Luke T O'Brien

2
@ LukeTO'Brien 3 argümanla kullanırsanız. 2 argümanla kullanırsanız, daha fazlasıdır ??(bu sorunun başka bir cevabına bakın: stackoverflow.com/a/20686360/1474939 )
Brian J

2
Bu cevap, VB'nin If üç parametre ile nasıl kullanılacağını gösterir . Yani değil C # 'ın benzer ??operatörü. Daha iyi cevap Code Maverick's If ise iki argümanla . (Nick'in yıllar önce benzer bir cevabı vardı, ancak MSDN'den açıklama içermiyor.)
ToolmakerSteve

1
Bu tamamen farklı bir soruyu cevaplıyor.
Marc Gravell

1
Önceki yorumları anlamak için düzenleme geçmişine bakın.
Zev Spitz


70

Kabul edilen cevabın herhangi bir açıklaması yoktur ve sadece bir bağlantıdır.
Bu nedenle, Ifoperatörün MSDN'den nasıl çalıştığını açıklayan bir cevap bırakacağımı düşündüm :


Operatör (Visual Basic)

İki değerden birini koşullu olarak döndürmek için kısa devre değerlendirmesini kullanır. Eğer operatör üç argümanlarla ya da iki argümanlarla çağrılabilir.

If( [argument1,] argument2, argument3 )


Operatör İki Argümanla Çağırıldıysa

If için ilk argüman atlanabilir. Bu, operatörün yalnızca iki argüman kullanarak çağrılmasını sağlar. Aşağıdaki liste yalnızca If işleci iki bağımsız değişkenle çağrıldığında geçerlidir .


parçalar

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.


Tüm Boole bağımsız değişken atlanırsa, ilk değişken bir başvuru ya da olabilecek türde olmalıdır. İlk bağımsız değişken Hiçbir şey olarak değerlendirilmezse , ikinci bağımsız değişkenin değeri döndürülür. Diğer tüm durumlarda, ilk argümanın değeri döndürülür. Aşağıdaki örnekte bu değerlendirmenin nasıl çalıştığı gösterilmektedir.


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

İkiden fazla değerin (iç içe yerleştirilmiş if) nasıl işleneceğine ilişkin bir örnek :

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

18

Bir uzantı yöntemi kullanabilirsiniz. Bu COALESCE, SQL gibi çalışır ve muhtemelen test etmeye çalıştığınız şey için aşırıya kaçar, ancak çalışır.

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

Yerleşik If(nullable, secondChoice)yalnızca işleyebilir iki null seçimler. Burada, istenildiği Coalescekadar parametre yapılabilir . İlk boş olmayan değer döndürülür ve parametrelerin geri kalanı bundan sonra değerlendirilmez (kısa devre, AndAlso/ &&ve OrElse/ gibi ||)


8
Çünkü dilin yerleşik bir operatörü var. Genişletme yöntemlerine bakmak için bile bir neden yok.
Nick

2
Başka birinin cevabını tekrarlamayacağım. Tek bir ifadeyle birden fazla değeri kontrol etmeniz gerekiyorsa alternatif bir çözüm sağlamanın güzel olabileceğini düşündüm. YANLIŞ bir cevap olmadığı için, o zaman indirilmemeli mi?
StingyJack

1
Jenerikler kullanarak uygulama sağlamak ve tip döküm / boks /
kutudan

4
@Hayır, özür dilerim, ama sadece yanılıyorsun. İkiden fazla birleşim argümanınız varsa, yerleşik işlev bunu kesmez.
toddmo

Obj parametresini atlayabilir ve vücudun Return args.FirstOrDefault(Function(arg) arg IsNot Nothing):-) olmasına izin verebilirsiniz
Ulf Åkerstedt

11

Bu çözümlerin çoğunun önemli bir kısıtlaması kısa devre yapmayacaklarıdır. Bu nedenle aslında buna eşdeğer değildirler ??.

Daha Ifönceki parametre hiçbir şeyi değerlendirmediği sürece, yerleşik işleç sonraki parametreleri değerlendirmez.

Aşağıdaki ifadeler eşdeğerdir:

C #

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

VB

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

Bu, çalıştığı tüm durumlarda işe yarayacaktır ??. Diğer çözümlerin herhangi biri, çalışma zamanı hatalarını kolayca ekleyebildikleri için çok dikkatli kullanılmalıdır.


Bu, bilinmeyen sayıda parametrenin olduğu durumlarda işe yaramaz (iyi .. yürütme sırasında o anda parametre sayısıyla eşleşecek bir deyimi önceden derlemek için roslyn veya codedom kullanmadan).
StingyJack

@StingyJack Bu amaçlanmamıştır. Tam olarak ne yapar ?? operatör yapar.
user1751825

2

Operator (Visual Basic) hakkında Microsoft belgelerine buradan ulaşabilirsiniz: https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/operators/if-operator

If( [argument1,] argument2, argument3 )

İşte bazı örnekler (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
Güzel! Yorum kaldırılıyor!
Alec
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.