Home All Groups Group Topic Archive Search About

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

Author
11 Oct 2006 11:24 AM
Philipp Brune
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

Author
11 Oct 2006 1:26 PM
Oenone
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
Author
11 Oct 2006 1:42 PM
Robinson
> 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
Author
11 Oct 2006 2:32 PM
Oenone
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("Downloaded " & msgcount &" message" & IIf(msgcount=1, "",
"s").ToString)
///

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

--

(O)enone
Author
11 Oct 2006 8:11 PM
teslar91
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.
Author
11 Oct 2006 10:59 PM
Mythran
<tesla***@hotmail.com> wrote in message
news:1160597464.396409.173100@b28g2000cwb.googlegroups.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
Author
12 Oct 2006 5:42 AM
teslar91
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(Flag, 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")
Author
12 Oct 2006 8:21 AM
Stephany Young
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.


<tesla***@hotmail.com> wrote in message
Show quoteHide quote
news:1160631750.200825.103600@m73g2000cwd.googlegroups.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(Flag, 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")
>
Author
12 Oct 2006 10:23 PM
Jay B. Harlow
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)

http://www.tsbradley.net/Cookbook/Generics/genericIIf.aspx

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


Show quoteHide quote
"Oenone" <oen***@nowhere.com> wrote 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
>
Author
13 Oct 2006 8:45 AM
Oenone
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
Author
11 Oct 2006 2:49 PM
Patrice
If this is for display you could also use databinding and the Format/Parse
handlers...

--
Patrice

"Philipp Brune" <philipp.br***@t-online.de> a écrit dans le message de news:
egik9l$6da$0***@news.t-online.com...
Show quoteHide quote
> 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
Author
11 Oct 2006 5:43 PM
Herfried K. Wagner [MVP]
Show quote Hide quote
"Philipp Brune" <philipp.br***@t-online.de> schrieb:
> 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/>