A matter of style : Switch or ?: [modified]
-
Suddenly not sure which of the following constructs I should go with... I really like the compactness of B, but a bit unsure how my fellow coders would react to seeing the construct. I can't see how there should be any performance differences (if you know differently - Do tell) A:
int i;
switch (ID) {
case "a":
i = 1;
break;
case "b":
i= 2;
break;
case "c":
i = 3;
break;
default:
i = 0;
break;
}B:
int i;
i = ID == "a" ? 1 :
ID == "b" ? 2 :
ID == "c" ? 3 :
0;What would you use (and why)?
modified on Tuesday, October 20, 2009 6:46 AM
Hi, if it is just one matching you can go with approach 'B' otherwise i will prefer the First Approach 'A' because the Second Type has to be parsed as first and process. and Even if it is more than 2 matching it is not good practice to use 'B' because it is not much readable and understandable.and for each case we can make a comment(purpose) in 'A', But it is not suitable for 'B' but anyway it depends on the place where use, and the situation where you use,and even the appearance where you use thanks
-
Suddenly not sure which of the following constructs I should go with... I really like the compactness of B, but a bit unsure how my fellow coders would react to seeing the construct. I can't see how there should be any performance differences (if you know differently - Do tell) A:
int i;
switch (ID) {
case "a":
i = 1;
break;
case "b":
i= 2;
break;
case "c":
i = 3;
break;
default:
i = 0;
break;
}B:
int i;
i = ID == "a" ? 1 :
ID == "b" ? 2 :
ID == "c" ? 3 :
0;What would you use (and why)?
modified on Tuesday, October 20, 2009 6:46 AM
I'll go for Switch because its easy to track errors in that.
-
Suddenly not sure which of the following constructs I should go with... I really like the compactness of B, but a bit unsure how my fellow coders would react to seeing the construct. I can't see how there should be any performance differences (if you know differently - Do tell) A:
int i;
switch (ID) {
case "a":
i = 1;
break;
case "b":
i= 2;
break;
case "c":
i = 3;
break;
default:
i = 0;
break;
}B:
int i;
i = ID == "a" ? 1 :
ID == "b" ? 2 :
ID == "c" ? 3 :
0;What would you use (and why)?
modified on Tuesday, October 20, 2009 6:46 AM
@OriginalGriff Fixed the switch for ya ;P clarity and readability are much more important than saving space on screen. Agreed 100% Which is why I posted - As the ?: was/is very clear to me, and I can at a glance understand what's going on, but I'm well aware it's not a construct used that/as often, so wanted to test the waters with other coders. -debugging nested ternary's is an absolute nightmare -I'll go for Switch because its easy to track errors in that. Good point As this is a *very* simple case I didn't even think of that actually. But it might need to get more complicated as the code evolves. Where I'm using it, it's not very likely though - But those are "famous last words", so point taken and agreed to. -- Thank you all for the feed back - I'll tidy up my code now :cool:
-
Suddenly not sure which of the following constructs I should go with... I really like the compactness of B, but a bit unsure how my fellow coders would react to seeing the construct. I can't see how there should be any performance differences (if you know differently - Do tell) A:
int i;
switch (ID) {
case "a":
i = 1;
break;
case "b":
i= 2;
break;
case "c":
i = 3;
break;
default:
i = 0;
break;
}B:
int i;
i = ID == "a" ? 1 :
ID == "b" ? 2 :
ID == "c" ? 3 :
0;What would you use (and why)?
modified on Tuesday, October 20, 2009 6:46 AM
As others said
switch
is more readable in this case. Also when switch has more labels, compilers use a lookup table (probably hash tables) to implement that and it will yield in accessing all the labels in constant time. :)Best wishes, Navaneeth
-
Suddenly not sure which of the following constructs I should go with... I really like the compactness of B, but a bit unsure how my fellow coders would react to seeing the construct. I can't see how there should be any performance differences (if you know differently - Do tell) A:
int i;
switch (ID) {
case "a":
i = 1;
break;
case "b":
i= 2;
break;
case "c":
i = 3;
break;
default:
i = 0;
break;
}B:
int i;
i = ID == "a" ? 1 :
ID == "b" ? 2 :
ID == "c" ? 3 :
0;What would you use (and why)?
modified on Tuesday, October 20, 2009 6:46 AM
-
Suddenly not sure which of the following constructs I should go with... I really like the compactness of B, but a bit unsure how my fellow coders would react to seeing the construct. I can't see how there should be any performance differences (if you know differently - Do tell) A:
int i;
switch (ID) {
case "a":
i = 1;
break;
case "b":
i= 2;
break;
case "c":
i = 3;
break;
default:
i = 0;
break;
}B:
int i;
i = ID == "a" ? 1 :
ID == "b" ? 2 :
ID == "c" ? 3 :
0;What would you use (and why)?
modified on Tuesday, October 20, 2009 6:46 AM
It's not the matter of readability, infact i'll use switch due to performance gain over multiple if-else statements. There is detailed description of this thought here. http://www.ozcandegirmenci.com/post/2008/05/Switch-vs-If.aspx[^]
-
Suddenly not sure which of the following constructs I should go with... I really like the compactness of B, but a bit unsure how my fellow coders would react to seeing the construct. I can't see how there should be any performance differences (if you know differently - Do tell) A:
int i;
switch (ID) {
case "a":
i = 1;
break;
case "b":
i= 2;
break;
case "c":
i = 3;
break;
default:
i = 0;
break;
}B:
int i;
i = ID == "a" ? 1 :
ID == "b" ? 2 :
ID == "c" ? 3 :
0;What would you use (and why)?
modified on Tuesday, October 20, 2009 6:46 AM
mgkr wrote:
What would you use (and why)?
neither, because 1) needing such a conversion often indicates a bad design e.g. a bad choice of data structuring; 2) and when unavoidable, i.e. when I do need to map characters to small positive integers, I use a snippet that is based on
"literalString".IndexOf(char)
PS: at least two replies mentioned readability, which does not even appear (any more?) in the OP. I hate it when the OP gets edited, and yes readability is very important. :)Luc Pattyn
I only read code that is properly indented, and rendered in a non-proportional font; hint: use PRE tags in forum messages
Local announcement (Antwerp region): Lange Wapper? 59.24% waren verstandig genoeg om NEEN te stemmen; bye bye viaduct.
-
mgkr wrote:
What would you use (and why)?
neither, because 1) needing such a conversion often indicates a bad design e.g. a bad choice of data structuring; 2) and when unavoidable, i.e. when I do need to map characters to small positive integers, I use a snippet that is based on
"literalString".IndexOf(char)
PS: at least two replies mentioned readability, which does not even appear (any more?) in the OP. I hate it when the OP gets edited, and yes readability is very important. :)Luc Pattyn
I only read code that is properly indented, and rendered in a non-proportional font; hint: use PRE tags in forum messages
Local announcement (Antwerp region): Lange Wapper? 59.24% waren verstandig genoeg om NEEN te stemmen; bye bye viaduct.
10!
-
Suddenly not sure which of the following constructs I should go with... I really like the compactness of B, but a bit unsure how my fellow coders would react to seeing the construct. I can't see how there should be any performance differences (if you know differently - Do tell) A:
int i;
switch (ID) {
case "a":
i = 1;
break;
case "b":
i= 2;
break;
case "c":
i = 3;
break;
default:
i = 0;
break;
}B:
int i;
i = ID == "a" ? 1 :
ID == "b" ? 2 :
ID == "c" ? 3 :
0;What would you use (and why)?
modified on Tuesday, October 20, 2009 6:46 AM
Neither.
public enum IDenum { None , a , b , c }
...
IDenum ID = System.Enum.Parse ( typeof(IDenum) , whatever ) ;
(Except I use my own TryParse method.)
-
It's not the matter of readability, infact i'll use switch due to performance gain over multiple if-else statements. There is detailed description of this thought here. http://www.ozcandegirmenci.com/post/2008/05/Switch-vs-If.aspx[^]
No, it's definitely about readability.
-
In my opinion, a switch on a string value is definitely a code smell. But using if/else or the ternary operator simply to avoid a switch is worse.