C#开关:案例不属于其他案例限制
时间:2020-03-05 18:50:10 来源:igfitidea点击:
这个问题是这个问题的一种添加
在C#中,切换案例无法陷入其他案例,这会导致编译错误。在这种情况下,我只是在所选月份的月份总数中添加一些数字,此后的每个后续月份中都会添加一些数字。 (简单的例子,并不意味着是真实的)
switch (month) { case 0: add something to month totals case 1: add something to month totals case 2: add something to month totals default: break; }
在C中是否有逻辑上的替代方案,而不必编写大量的if语句?
if (month <= 0) add something to month if (month <= 1) add something to month if (month <= 2) add something to month .... etc
解决方案
回答
已经有一个针对这个主题的问题:
Cswitch语句为什么会受到限制?
编辑:
我要指出的主要目的是,亲爱的野兽,是两个名字几乎相同的问题,这给问题集增加了混乱。
回答
很多时候,当我们看到巨大的switch语句或者许多if语句可能会陷入多个块的噪音时,我们试图抑制不良的设计。
相反,如果我们实现了规范模式以查看某项是否匹配,然后对其采取行动,该怎么办?
foreach(MonthSpecification spec in this.MonthSpecifications) { if(spec.IsSatisfiedBy(month)) spec.Perform(month); }
那么我们就可以添加与我们要执行的操作相匹配的不同规格。
很难说出域名是什么,因此我的示例可能有些人为。
回答
我们要添加常量吗?如果是这样,也许这样的事情会起作用(C语法):
const int addToTotals[] = {123, 456, ..., 789}; for(i=month;i<12;i++) totals += addToTotals[i];
如果我们需要更复杂的语句,而不是在接下来的每个月的总计中添加常量,则可以使用变量或者函数指针执行类似的操作。
-亚当
回答
在Cswitch语句中,只有没有针对我们要通过的案例的语句时,我们才能通过案例
switch(myVar) { case 1: case 2: // Case 1 or 2 get here break; }
但是,如果我们想发表声明,则必须使用可怕的GOTO
switch(myVar) { case 1: // Case 1 statement goto case 2; case 2: // Case 1 or 2 get here break; }
回答
以相反的顺序写开关盒
case 2: case 1: case 0: break; default:
希望有帮助!