VB.NET equivalent of C# Operator '??'

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Philipp Brune

    VB.NET equivalent of C# Operator '??'

    Hello Newsgroup,

    in c# there exists the '??' operator.

    It is used like this :

    string s1 = null;
    string s2 = s1 ?? "(undefined )"

    And does the following (simplified) :

    if(s1 == null)
    s2 = "(undefined )"
    else
    s2 = s1

    Is there an equivalent operator in Visual Basic.Net, and if so, how is
    it called ?

    Thanks in advance

    Philipp
  • Oenone

    #2
    Re: VB.NET equivalent of C# Operator '??'

    Philipp Brune wrote:
    Is there an equivalent operator in Visual Basic.Net, and if so, how is
    it called ?
    I think the closest you'll get to that is by using IIf:

    \\\
    Dim s1 As String = Nothing
    Dim s2 As String = IIf(s1 Is Nothing, "(undefined )", s1).ToString
    ///

    HTH,

    --

    (O)enone


    Comment

    • Robinson

      #3
      Re: VB.NET equivalent of C# Operator '??'

      I think the closest you'll get to that is by using IIf:
      >
      \\\
      Dim s1 As String = Nothing
      Dim s2 As String = IIf(s1 Is Nothing, "(undefined )", s1).ToString
      ///
      >
      Yes, however, what is more readable? This:

      If s1 Is Nothing Then
      s2 = "(undefined )"
      Else
      s2 = s1
      End If



      or this:



      s2 = IIf(s1 Is Nothing, "(undefined )", s1).ToString



      We also had this debate at work and decided the former was better (in the
      context of C++, not .NET, ie. z = ( v < w ? x : y ) ). These functions do
      well to help obfuscate code however ;)



      Robin


      Comment

      • Oenone

        #4
        Re: VB.NET equivalent of C# Operator '??'

        Robinson wrote:
        >I think the closest you'll get to that is by using IIf:
        Yes, however, what is more readable?
        I'd certainly say the "full" version is more readable and maintainable than
        the abbreviated IIf version.

        Personally the only thing I normally use IIf for is adding plurals to status
        message, for example:

        \\\
        MsgBox("Downloa ded " & msgcount &" message" & IIf(msgcount=1, "",
        "s").ToStri ng)
        ///

        In other situations (and arguably in this one too) they nearly always make
        the code harder to read.

        --

        (O)enone


        Comment

        • Patrice

          #5
          Re: VB.NET equivalent of C# Operator '??'

          If this is for display you could also use databinding and the Format/Parse
          handlers...

          --
          Patrice

          "Philipp Brune" <philipp.brune@ t-online.dea écrit dans le message de news:
          egik9l$6da$01$1 @news.t-online.com...
          Hello Newsgroup,
          >
          in c# there exists the '??' operator.
          >
          It is used like this :
          >
          string s1 = null;
          string s2 = s1 ?? "(undefined )"
          >
          And does the following (simplified) :
          >
          if(s1 == null)
          s2 = "(undefined )"
          else
          s2 = s1
          >
          Is there an equivalent operator in Visual Basic.Net, and if so, how is it
          called ?
          >
          Thanks in advance
          >
          Philipp

          Comment

          • Herfried K. Wagner [MVP]

            #6
            Re: VB.NET equivalent of C# Operator '??'

            "Philipp Brune" <philipp.brune@ t-online.deschrie b:
            in c# there exists the '??' operator.
            >
            It is used like this :
            >
            string s1 = null;
            string s2 = s1 ?? "(undefined )"
            >
            And does the following (simplified) :
            >
            if(s1 == null)
            s2 = "(undefined )"
            else
            s2 = s1
            >
            Is there an equivalent operator in Visual Basic.Net, and if so, how is it
            called ?
            No, there is no such operator in VB. Note that '??' performs additional
            operations for nullable types ('Nullable(Of T)').

            --
            M S Herfried K. Wagner
            M V P <URL:http://dotnet.mvps.org/>
            V B <URL:http://dotnet.mvps.org/dotnet/faqs/>

            Comment

            • teslar91@hotmail.com

              #7
              Re: VB.NET equivalent of C# Operator '??'

              I like the brevity of IIF in certain cases, and do use it. Sometimes
              expanding code horizontally reduces readability less than expanding
              vertically.

              Just remember that unlike If/Then/Else/EndIf, it evaluates *both* true
              and false expressions all the time, and so can cause unexpected errors.
              For example, if the false expression is invalid when the condition is
              true, you still get an error. It's also slower for that reason, and
              recently I've found reason to suspect it does some unnecessary type
              conversions behind-the-scenes as well.

              Comment

              • Mythran

                #8
                Re: VB.NET equivalent of C# Operator '??'


                <teslar91@hotma il.comwrote in message
                news:1160597464 .396409.173100@ b28g2000cwb.goo glegroups.com.. .
                >I like the brevity of IIF in certain cases, and do use it. Sometimes
                expanding code horizontally reduces readability less than expanding
                vertically.
                >
                Just remember that unlike If/Then/Else/EndIf, it evaluates *both* true
                and false expressions all the time, and so can cause unexpected errors.
                For example, if the false expression is invalid when the condition is
                true, you still get an error. It's also slower for that reason, and
                recently I've found reason to suspect it does some unnecessary type
                conversions behind-the-scenes as well.
                >
                The IIf function doesn't do anything special...

                How would you write a function named IIf?

                I bet something like:

                Public Function IIF(ByVal Expression As Boolean, ByVal ReturnTrue As Object,
                ByVal ReturnFalse As Object) As Object
                If Expression
                Return ReturnTrue
                Else
                Return ReturnFalse
                End If
                End Function

                eh? Nothing special here. Just return ReturnTrue if the expression passed
                into the function is true, otherwise return ReturnFalse. No unnecessary
                type conversions, no slowness due to it doing anything special. I bet the
                slowness is caused by only the unnecessary function call to IIf rather than
                performing the if logic yourself.

                Hmm...HTH,
                Mythran


                Comment

                • teslar91@hotmail.com

                  #9
                  Re: VB.NET equivalent of C# Operator '??'

                  Mythran wrote:
                  The IIf function doesn't do anything special...
                  >
                  How would you write a function named IIf?
                  >
                  I bet something like:
                  >
                  Public Function IIF(ByVal Expression As Boolean, ByVal ReturnTrue As Object,
                  ByVal ReturnFalse As Object) As Object
                  If Expression
                  Return ReturnTrue
                  Else
                  Return ReturnFalse
                  End If
                  End Function
                  <clip>

                  That's exactly the way I imagine it. And there lies the source of the
                  issues I mentioned.

                  Consider:

                  If Flag Then
                  AString = BString & CString
                  Else
                  AString = CString & BString
                  End If

                  Versus:

                  AString=Iif(Fla g, BString & CString, CString & BString)

                  In the If/Then/Else/EndIf version, *one* string concatenation is
                  performed, regardless of whether Flag is True or False. But in the Iif
                  version, *two* string concatenations are performed, as both the
                  ReturnTrue and ReturnFalse parameters must be fully evaluated before
                  being passed to the Iif function for selection.

                  Normally this doesn't make much difference; but it can if you've got
                  some slow-evaluating expressions, or you're trying to squeeze every
                  possible bit of speed out of an inner loop.

                  And that's also the reason why this code will handle Divisor = 0:

                  If Divisor <0 Then
                  TextBox1.Text = Dividend / Divisor
                  Else
                  TextBox1.Text = "Overflow"
                  End If

                  And this seemingly equivalent code will fail:

                  TextBox1.Text = Iif(Divisor <0, Dividend / Divisor, "Overflow")

                  Comment

                  • Stephany Young

                    #10
                    Re: VB.NET equivalent of C# Operator '??'

                    It's even simpler than that.

                    It is actually implemented as:

                    If Expression Then Return ReturnTrue
                    Return ReturnFalse

                    which avoids the overhead of the Else, however small that may be.

                    The point is, as you have spotted, that the bottleneck on IIf, is in the
                    evaluation of the expression and the true and false parts in the parameter
                    assignment part of the call, rather than inside the method itself.

                    The other point about IIf, is that the true and false parameters are both of
                    type Object, as is the return value. This means that the return value, in
                    most cases, must be converted to the required type to make the result
                    useful.


                    <teslar91@hotma il.comwrote in message
                    news:1160631750 .200825.103600@ m73g2000cwd.goo glegroups.com.. .
                    Mythran wrote:
                    >The IIf function doesn't do anything special...
                    >>
                    >How would you write a function named IIf?
                    >>
                    >I bet something like:
                    >>
                    >Public Function IIF(ByVal Expression As Boolean, ByVal ReturnTrue As
                    >Object,
                    >ByVal ReturnFalse As Object) As Object
                    > If Expression
                    > Return ReturnTrue
                    > Else
                    > Return ReturnFalse
                    > End If
                    >End Function
                    <clip>
                    >
                    That's exactly the way I imagine it. And there lies the source of the
                    issues I mentioned.
                    >
                    Consider:
                    >
                    If Flag Then
                    AString = BString & CString
                    Else
                    AString = CString & BString
                    End If
                    >
                    Versus:
                    >
                    AString=Iif(Fla g, BString & CString, CString & BString)
                    >
                    In the If/Then/Else/EndIf version, *one* string concatenation is
                    performed, regardless of whether Flag is True or False. But in the Iif
                    version, *two* string concatenations are performed, as both the
                    ReturnTrue and ReturnFalse parameters must be fully evaluated before
                    being passed to the Iif function for selection.
                    >
                    Normally this doesn't make much difference; but it can if you've got
                    some slow-evaluating expressions, or you're trying to squeeze every
                    possible bit of speed out of an inner loop.
                    >
                    And that's also the reason why this code will handle Divisor = 0:
                    >
                    If Divisor <0 Then
                    TextBox1.Text = Dividend / Divisor
                    Else
                    TextBox1.Text = "Overflow"
                    End If
                    >
                    And this seemingly equivalent code will fail:
                    >
                    TextBox1.Text = Iif(Divisor <0, Dividend / Divisor, "Overflow")
                    >

                    Comment

                    • Jay B. Harlow

                      #11
                      Re: VB.NET equivalent of C# Operator '??'

                      Oenone & others,
                      Dim s2 As String = IIf(s1 Is Nothing, "(undefined )", s1).ToString
                      If I need an IIf I normally use my Generic IIf, avoiding the need of
                      ToString or other awkward casts:

                      Dim s2 As String = IIf(s1 Is Nothing, "(undefined )", s1)



                      I have also simply overloaded IIf in .NET 1.x where the benefits of Generic
                      functions are not available...

                      --
                      Hope this helps
                      Jay B. Harlow
                      ..NET Application Architect, Enthusiast, & Evangelist
                      T.S. Bradley - http://www.tsbradley.net


                      "Oenone" <oenone@nowhere .comwrote in message
                      news:9i6Xg.2691 $69.72@newsfe3-gui.ntli.net...
                      Philipp Brune wrote:
                      >Is there an equivalent operator in Visual Basic.Net, and if so, how is
                      >it called ?
                      >
                      I think the closest you'll get to that is by using IIf:
                      >
                      \\\
                      Dim s1 As String = Nothing
                      Dim s2 As String = IIf(s1 Is Nothing, "(undefined )", s1).ToString
                      ///
                      >
                      HTH,
                      >
                      --
                      >
                      (O)enone
                      >

                      Comment

                      • Oenone

                        #12
                        Re: VB.NET equivalent of C# Operator '??'

                        Jay B. Harlow wrote:
                        If I need an IIf I normally use my Generic IIf, avoiding the need of
                        ToString or other awkward casts
                        Ah, very handy, thanks for that.

                        I'd tended to use my own string-based implementation of IIf, as it's nearly
                        always strings that I use as its return values, but the Generic version is
                        much nicer.

                        --

                        (O)enone


                        Comment

                        Working...