Visual Basic 6 did this, why can't you, C#?
-
Small rant about dumb choices. So C# doesn't allow cascading through switch
case
s. Ok, understandable. So why the :elephant: does it need me to repeat the :elephant:ingbreak;
after each and anycase
? There is no :elephant:ing need for it because there is nothing to break, apart from my patience. Rant over.GCS/GE d--(d) s-/+ a C+++ U+++ P-- L+@ E-- W+++ N+ o+ K- w+++ O? M-- V? PS+ PE Y+ PGP t+ 5? X R+++ tv-- b+(+++) DI+++ D++ G e++ h--- r+++ y+++* Weapons extension: ma- k++ F+2 X The shortest horror story: On Error Resume Next
-
Small rant about dumb choices. So C# doesn't allow cascading through switch
case
s. Ok, understandable. So why the :elephant: does it need me to repeat the :elephant:ingbreak;
after each and anycase
? There is no :elephant:ing need for it because there is nothing to break, apart from my patience. Rant over.GCS/GE d--(d) s-/+ a C+++ U+++ P-- L+@ E-- W+++ N+ o+ K- w+++ O? M-- V? PS+ PE Y+ PGP t+ 5? X R+++ tv-- b+(+++) DI+++ D++ G e++ h--- r+++ y+++* Weapons extension: ma- k++ F+2 X The shortest horror story: On Error Resume Next
Allowing fall through code was/is a huge source of bugs, and does not fall in line with best practices. During any refactoring, it's not uncommon to move/reorder code. Without close scrutiny, a break in logic flow would be so easily introduced by missing the fall through code. Worse, refactoring/reordering code might be necessary, but now fallthrough code has introduced an artificial constraint. For case statements with few case points, this requirement is a minor inconvenience at best. If, however, you have numerous case points, this might be indicative of a code smell. Such code is both difficult to understand and to follow. Perhaps a different approach might be more appropriate... fi ite state machines, keyword/lambda method dictionaries, etc. Something to consider when designing well crafted code that adheres to best practices.
-
I will propose a related extension to C#: Default fall through to the next method. If the flow runs out of a method body's closing brace, with no explicit return statement, execution continues to the following method. This would be very useful e.g. for methods that take arguments of two different kinds, say integer and string: The first method would accept, say, a numeric string and convert it to a binary integer, then flowing on to the following method doing the processing on binary integers, regardless of which entry point was used. Fortran has (or had?) its ENTRY statement providing this kind of functionality. While multiple entry points can be simulated by the first method explicitly calling the other, after format conversion, this adds a completely unnecessary statement, as well as a handful unnecessary instruction for the call management, and increased stack demands. I cannot think of any single use case were switch case fall through is well justified, and where the arguments for it can not reasonably be extended to justify method fall through. If one makes sense, so does the other.
Religious freedom is the freedom to say that two plus two make five.
int method ( int integer )
{return ( 42 ); }
int method ( string trigger )
{return ( method ( Int32.Parse ( trigger ) ) ); }
Gus Gustafson
-
Small rant about dumb choices. So C# doesn't allow cascading through switch
case
s. Ok, understandable. So why the :elephant: does it need me to repeat the :elephant:ingbreak;
after each and anycase
? There is no :elephant:ing need for it because there is nothing to break, apart from my patience. Rant over.GCS/GE d--(d) s-/+ a C+++ U+++ P-- L+@ E-- W+++ N+ o+ K- w+++ O? M-- V? PS+ PE Y+ PGP t+ 5? X R+++ tv-- b+(+++) DI+++ D++ G e++ h--- r+++ y+++* Weapons extension: ma- k++ F+2 X The shortest horror story: On Error Resume Next
-
OriginalGriff wrote:
Or even:
case 1,
2,
3:
{
... code
break;
}
case 4:
{
... code
break;
}The Pascal style (except for the 'break' statements). I don't like the C# 'No fallthrough except when the case alternative is empty', so I sort of agree with you, although it is not a big matter. I do upset some people by always using braces, like in your second alternative: Indentation and braces go hand-in-hand. Call it 'two-factor level nesting'. I want to indent the case alternative, so it should be made a block. Blocks are indented. Statements are not, neither single nor multiple statements. In- and un-denting without braces makes a mess of nesting levels.
Religious freedom is the freedom to say that two plus two make five.
You only need braces in the case when you're creating a new variable in the case. Otherwise, they're unnecessary.
".45 ACP - because shooting twice is just silly" - JSOP, 2010
-----
You can never have too much ammo - unless you're swimming, or on fire. - JSOP, 2010
-----
When you pry the gun from my cold dead hands, be careful - the barrel will be very hot. - JSOP, 2013 -
I blame Ken Thompson for the vast majority of bugs in today's software. The entire concept of null terminated strings and buffers is simply asking for trouble. DEC and IBM both had descriptor-based buffers, which gives the OS calls that manipulate buffers a way to block buffer overflows.
-
Probably because it was modelled on languages which do allow execution to fall-through, and without an explicit
break
/return
, early adopters might have thought the C# code was falling through. [Proposal] Case fall through should be allowed · dotnet/csharplang · Discussion #603 · GitHub[^] See also Eric Lippert's comments on SO:C# enforces the no-fall-through rule in every switch section, including the last one. This is so that switch sections can be re-ordered arbitrarily, possibly by mechanical tools, without introducing semantic changes in the program. C# enforces the no-fall-through rule by requiring that the end point of every switch section be unreachable. It is not necessary for a switch section to end in a break. It can end in a break, return, goto, continue, throw, or a detectable infinite loop:
"These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer
:) As opposed to an undetectable infinite loop?
Time is the differentiation of eternity devised by man to measure the passage of human events. - Manly P. Hall Mark Just another cog in the wheel
-
:) As opposed to an undetectable infinite loop?
Time is the differentiation of eternity devised by man to measure the passage of human events. - Manly P. Hall Mark Just another cog in the wheel
Indeed. The compiler isn't magic, and there are constructs which are obvious infinite loops to a human which the compiler cannot detect as such. For example:
switch (x)
{
case 1:
while (x < 42);
case 2:
return 123;
}Whilst we can clearly see that the loop is infinite, since
x
starts as1
and is never modified within the loop, the compiler still complains:Quote:
CS0163 Control cannot fall through from one case label ('case 1:') to another
"These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer
-
:) As opposed to an undetectable infinite loop?
Time is the differentiation of eternity devised by man to measure the passage of human events. - Manly P. Hall Mark Just another cog in the wheel
In my student days, "correctness proofs" were the rage. Everyone were convinced that soon, a program would be able to prove (or disprove) that a program behaved according to specifications. The first real proof we learned in that course was not a program, but a logical proof that no program analyzer can, in the general case, detect every possible infinte loop. I did understand the proof then; I don't remember the details today, and even if I found the text, I would probably be unable to explain it to someone unfamiliar with it. But I know the proof exists (just like I know that there exists a proof that you cannot trisect an arbitrary angle); I trust the experts that the proof still holds.
-
You only need braces in the case when you're creating a new variable in the case. Otherwise, they're unnecessary.
".45 ACP - because shooting twice is just silly" - JSOP, 2010
-----
You can never have too much ammo - unless you're swimming, or on fire. - JSOP, 2010
-----
When you pry the gun from my cold dead hands, be careful - the barrel will be very hot. - JSOP, 2013They are "unnecessary" only if you accept indents and undents with no supporting braces. Braces and indents are the 2-factor element of program layout. You can equally well say that 2-factor authentication is "unneccessary" when you have already supplied a password. Some of us nevertheless think 2-factor is a good idea, both in authentication and in code layout.
-
Small rant about dumb choices. So C# doesn't allow cascading through switch
case
s. Ok, understandable. So why the :elephant: does it need me to repeat the :elephant:ingbreak;
after each and anycase
? There is no :elephant:ing need for it because there is nothing to break, apart from my patience. Rant over.GCS/GE d--(d) s-/+ a C+++ U+++ P-- L+@ E-- W+++ N+ o+ K- w+++ O? M-- V? PS+ PE Y+ PGP t+ 5? X R+++ tv-- b+(+++) DI+++ D++ G e++ h--- r+++ y+++* Weapons extension: ma- k++ F+2 X The shortest horror story: On Error Resume Next
Allowing fall through code was/is a huge source of bugs, and does not fall in line with best practices. During any refactoring, it's not uncommon to move/reorder code. Without close scrutiny, a break in logic flow would be so easily introduced by missing the fall through code. Worse, refactoring/reordering code might be necessary, but now fallthrough code has introduced an artificial constraint. For case statements with few case points, this requirement is a minor inconvenience at best. If, however, you have numerous case points, this might be indicative of a code smell. Such code is both difficult to understand and to follow. Perhaps a different approach might be more appropriate... finite state machines, keyword/lambda method dictionaries, etc. Something to consider when designing well crafted code that adheres to best practices.
-
Small rant about dumb choices. So C# doesn't allow cascading through switch
case
s. Ok, understandable. So why the :elephant: does it need me to repeat the :elephant:ingbreak;
after each and anycase
? There is no :elephant:ing need for it because there is nothing to break, apart from my patience. Rant over.GCS/GE d--(d) s-/+ a C+++ U+++ P-- L+@ E-- W+++ N+ o+ K- w+++ O? M-- V? PS+ PE Y+ PGP t+ 5? X R+++ tv-- b+(+++) DI+++ D++ G e++ h--- r+++ y+++* Weapons extension: ma- k++ F+2 X The shortest horror story: On Error Resume Next