I have a code:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
switch (keyData)
{
case Keys.Alt|Keys.D1:
if (this._condition1)
{
return true;
}
else
{
return base.ProcessCmdKey(ref msg, keyData);
}
break;
case Keys.Control |Keys.U:
if (this._condition2)
{
return true;
}
else
{
return base.ProcessCmdKey(ref msg, keyData);
}
break;
default:
return base.ProcessCmdKey(ref msg, keyData);
}
return true;
It gives me “unreachable code detected” warning on breaks.
Is it good practice not to use break operator here ? I don’t want to turn off “unreachable code detected” warning.
PS: There are many case in my ProcessCmdKey method.
There are three unreachable statements in your code, first two are the break statements and the last one int he last line "return true" is also unreachable, I dont know whether C# compiler detects that or not, but logically there is no way last return statement will also be reached.
There are multiple ways to solve this issue,
Better Design Way
If you return values within switch cases, it may be difficult to analyze your code later on by you or someone else, usually it is better to keep a return value temp variable and return it at end of function, that becomes easier to debug and understand the code for new coder.
Switch can be complicated, and more returns within switch may not have better control, if you want to implement logging, debugging, returns from cases could be complicated. And it becomes way to difficult browsing the logic flow graphs.
So it is better to avoid return altogather from case, but still it depends on situtations as well, one needs to make an intelligent decision here.
** Design Recommendations **
After probably 13 years since original answer, I have found out following design guideline.
Switch should not be mixed with any other
switchorforor any other control flow statement.Switch should always be a separate method and it should only do selection based on the input and return something.
Reason being, if you want to analyze results or cache results in map, or you may want to change the logic from switch to function pointers or something else, it should not change rest of the code.