2009-03-10 10 views

Antwort

15

Ich denke, man kann mit der Verwendung eines Inline-nahe kommen if-Anweisung:

//C# 
int x = a ? b : c; 

'VB.Net 
Dim x as Integer = If(a, b, c) 
+3

* Hinweis: Mit der if-Anweisung funktioniert das nur in VB.NET 2008 und höher. –

+0

Um die Funktion If() als Koaleszenzoperator zu verwenden, muss sie mit nur zwei Parametern aufgerufen werden und für Referenztypen verwendet werden: 'Dim objC = If (objA, objB)' Dies würde objC auf objA setzen es sei denn objA ist Nothing, in diesem Fall würde objC auf objB gesetzt werden, ob es Nothing ist oder nicht. –

-3

Wenn sollten IIf sein

Dim x as Integer=IIf(a,b,c)

+6

Nein. IIf wertet alle Parameter aus, da es sich um einen normalen Anruf handelt. Siehe http://dotnetslackers.com/VB_NET/re-55021_IIF_becomes_If_and_a_true_ternary_operator.aspx – LosManos

3

nur als Referenz, Coalesce Operator für Streich

Private Function Coalesce(ByVal ParamArray Parameters As String()) As String 
    For Each Parameter As String In Parameters 
     If Not Parameter Is Nothing Then 
      Return Parameter 
     End If 
    Next 
    Return Nothing 
End Function 
12
Sub Main() 
    Dim x, z As Object 
    Dim y As Nullable(Of Integer) 
    z = "1243" 

    Dim c As Object = Coalesce(x, y, z) 
End Sub 

Private Function Coalesce(ByVal ParamArray x As Object()) 
    Return x.First(Function(y) Not IsNothing(y)) 
End Function 
+0

Mit LINQ ist dies die effektivste 'Coalesce()' Implementierung um. – miroxlav

+2

Das Problem damit (und ivan's unten) ist, dass alle Parameter ausgewertet werden. Also, wenn ich 'Dim thingie = Coalesce (Session (" dingie "), neues Thingie) schreibe, wird jedes Mal ein neues Thingie-Objekt erstellt (obwohl es weggeworfen wird, wenn ein Thingie in der Session existiert) –