|
web
newsgroups
|
|||||||||||||||||||||||
|
|||||||||||||||||||||||
VB.NET equivalent of C# Operator '??'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 Philipp Brune wrote:
> Is there an equivalent operator in Visual Basic.Net, and if so, how is I think the closest you'll get to that is by using IIf:> it called ? \\\ Dim s1 As String = Nothing Dim s2 As String = IIf(s1 Is Nothing, "(undefined)", s1).ToString /// HTH, -- (O)enone > I think the closest you'll get to that is by using IIf: Yes, however, what is more readable? This:> > \\\ > Dim s1 As String = Nothing > Dim s2 As String = IIf(s1 Is Nothing, "(undefined)", s1).ToString > /// > 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 Robinson wrote:
>> I think the closest you'll get to that is by using IIf: I'd certainly say the "full" version is more readable and maintainable than > Yes, however, what is more readable? 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 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. <tesla***@hotmail.com> wrote in message
news:1160597464.396409.173100@b28g2000cwb.googlegroups.com... The IIf function doesn't do anything special...>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. > 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 Mythran wrote:
> The IIf function doesn't do anything special... <clip>> > 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 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") 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") > 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... -- Show quoteHide quoteHope this helps Jay B. Harlow ..NET Application Architect, Enthusiast, & Evangelist T.S. Bradley - http://www.tsbradley.net "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 > Jay B. Harlow wrote:
> If I need an IIf I normally use my Generic IIf, avoiding the need of Ah, very handy, thanks for that.> ToString or other awkward casts 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 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
Show quote
Hide quote
"Philipp Brune" <philipp.br***@t-online.de> schrieb: No, there is no such operator in VB. Note that '??' performs additional > 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 ? 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/>
Using For Each in a Custom collection class with hashtables
Compiling for .NET Framework 1.x in VS 2005 How to open a .CSV file ? Moving Forms Search for Directories/files/Folders When "As New" or not when instantiating? Sql server express 2005 connections open DataTable - Date Difference "using statments" slightly OT: VB user base |
|||||||||||||||||||||||