我现在正在研究C#,遇到以下情况,有什么更好的实践,重复像“EX 1”这样的代码或使用像{EX 2“这样的goto
语句?
我不想要个人意见。
// EX 1:
switch (a)
{
case 3:
b = 7;
c = 3; // duplicate code <-|
break; // |
case 4: // |
c = 3; // duplicate code --|
break;
default:
b = 2;
c = 4;
break;
}
// EX 2:
switch (a)
{
case 3:
b = 7;
goto case 4; // not duplicate code and use goto statement
case 4:
c = 3;
break;
default:
b = 2;
c = 4;
break;
}
答案 0 :(得分:5)
这取决于。
案例3是案例4的特例吗?
在那种情况下,goto可能是有序的,因为如果我们在稍后的时间点为案例4添加一些新的行为,那么我们也将自动获得案例3。
如果案例3&amp; 4是无关的,然后复制代码更好。
如果你的真实情况很小,线条很少,我宁愿复制代码,因为它简单易读。
答案 1 :(得分:1)
我个人不喜欢goto
,因为这会让您的代码不易理解和重现。
我发现您的第一个代码示例没有重大问题。如果需要,您还可以分割b
和c
的处理,如果有意义的话。
你应该考虑更重要的事情:
goto
。答案 2 :(得分:1)
+ Common structure + Simple to understand logic - More lines of code - Code repetition
+ Fewer lines of code + No code repetition - It complicates logic - It is not commonly used in production code
我更喜欢示例1,因为在这个特定的实例中,节省的费用很少,但逻辑变得更复杂。可以说,Goto
,如果更多的人开始使用相同的代码,代码的难度增加,则会增加错误的可能性。我们来看看this embarrassing bug。如果开发人员没有使用goto
,就不会出现这样的问题!
enums
进行案例选择,因此case 3:
=&gt; case CarPart.SteeringWheel
case
都有break;
default
案例考虑使用多态和继承而不是switch case
ICarPart part1 = new SteeringWheel();
ICarPart part2= new Mirror();
var parts = new List<ICarPart>() {part1, part2};
// now call your original method on the parts
// no more need for a switch case
答案 3 :(得分:1)
一般来说,使用goto
是considered to be bad practice(并且正确地如此),但仅使用goto
进行结构化控制语句的向前跳转通常被认为是正常的,尤其是另一种方法是使代码更复杂。
以下是一个例子:
for (...) {
for (...) {
...
if (something)
goto end_of_loop;
}
}
end_of_loop:
Here您检查goto
的其他一些可接受的用法。
因此,goto
将被视为不良做法。但是,正如我所说,它仍然可以使用。