我有一个switch case,有4个案例具有相同的通用代码,但我需要为它们初始化变量:
int a,b,c;
switch(type)
{
case A:
case B:
case C:
case D:
foo(a,b,c);
}
我目前所拥有的是a = type == A ? 1 : 2;
和一些复杂的变量:
if(type == A)
b = 1;
else if(type == B)
b = 5;
else
b = 2;
这很有效,但在我看来看起来很难看,而且不是很流利。我可以完全划分案例,但我想避免在我的代码中复制粘贴。
我希望做的是:
int a,b,c;
switch(type)
{
case A:
a = 1;
b = 1;
case B:
a = 2;
b = 5;
case C:
case D:
a = 1;
b = 2;
foo(a,b,c);
}
但是这显然无效,因为即使案例是A或B,case D
变量赋值也会发生。有没有办法以整洁(和工作:)的方式实现这一点?
编辑: switch
实际上是为了过滤其他个案,所以我确实希望这些特定4个案例中的foo()
答案 0 :(得分:5)
根据您的代码,您可以执行以下操作:
<div class="col-xs-12 col-sm-12">
<fieldset>
<input type="radio" formControlName="specificPilot" [value]="1" [ngClass]="{'td-radio-error': displayMessage.specificPilot}" (check)="radioSetValidator(changeForm.get('generalQuestionsFG.specificPilot'),[changeForm.get('generalQuestionsFG.pilotTransits')])">Yes
<input type="radio" formControlName="specificPilot" [value]="0" [ngClass]="{'td-radio-error': displayMessage.specificPilot}" (check)="radioSetValidator(changeForm.get('generalQuestionsFG.specificPilot'),[changeForm.get('generalQuestionsFG.pilotTransits')])">No
{{this.changeForm.get('generalQuestionsFG.specificPilot').value}}
</fieldset>
</div>
<div class="col-xs-12 col-sm-12">
<textarea class="form-control" rows="2" formControlName="pilotTransits" style="width:100%" placeholder="Provide Transits for Pilot(s)"
*ngIf="changeForm.get('generalQuestionsFG.specificPilot').value==='1'"> </textarea>
</div>
为了证明这个使用int a,b,c;
switch(type)
{
case A:
a = 1;
b = 1;
goto call_foo;
case B:
a = 2;
b = 5;
goto call_foo;
case C:
case D:
a = 1;
b = 2;
call_foo:
foo(a,b,c);
break;
// [...] more cases
}
,恕我直言,你在这个结构中的逻辑需要更加复杂。
答案 1 :(得分:4)
使用显式控制变量清楚说明:
int a, b, c;
int run_foo = 1;
switch(type) {
case A:
a = 1; b = 1;
break;
case B:
a = 2; b = 5;
break;
case C:
case D:
a = 1; b = 2;
break;
default:
run_foo = 0;
break;
}
if (run_foo) { foo(a,b,c); }
答案 2 :(得分:3)
因此,您无需为foo()
中的类型调用{A, B, C, D}
,是吗?解决方案很简单:
int a, b, c;
switch (type) {
case A:
a = 1;
b = 1;
break;
case B:
a = 2;
b = 5;
break;
case C:
case D:
a = 1;
b = 2;
break;
default:
return; // no foo() for this case
}
foo(a, b, c);
答案 3 :(得分:2)
除了案例C,并且在switch语句中使用goto时,你不能避免硬中断;随着维护人员效仿,只会导致越来越多的意大利面条。如果您只是想减少交换机中的代码行数,可以使用函数或宏。
#define DoFooCase(_a, _b, _c) a = _a; b = _b; foo(a, b, _c);
switch(t) // Can't use type, it's keyword.
{
case A:
DoFooCase(1, 1, c);
break;
case B:
DoFooCase(2, 5, c);
break;
case C:
case D:
DoFooCase(1, 2, c);
break;
}