C# 简化if条件?
我有以下代码:C# 简化if条件?,c#,if-statement,refactoring,C#,If Statement,Refactoring,我有以下代码: int someValue = 100; if (x == 5) { if (someCondition) { return someValue; } return someValue / 12; } if (x == 6) { if (someCondition) { return someValue * 12; } return someValue; } 正如您所看到的
int someValue = 100;
if (x == 5)
{
if (someCondition)
{
return someValue;
}
return someValue / 12;
}
if (x == 6)
{
if (someCondition)
{
return someValue * 12;
}
return someValue;
}
正如您所看到的,某些条件总是相同的,只是返回的值不同。有没有一种方法可以进一步简化此过程?处理同一条条件语句的结果有不同的方法。正因为如此,它可能是更有效的(和更容易的眼睛)保持它的方式,你有它 如果每个条件语句的
return
表达式都相同,那么我会修改代码,但是每个代码块都有不同的return
值,因此它是唯一的
因此,没有办法简化您的工作。我个人会使用switch语句,而不是两个if语句。或者你可以做一个传递x*12或x/12的函数…这取决于你所说的简化 以下代码行数较少,在可读性方面没有任何损失(IMO): 你有两个变量(
x
和someCondition
),和3个不同的结果;因此,是的,您可以做得比两对嵌套测试更好。您所能做的就是:
if (((x == 5) && someCondition)) ||
((x == 6) && !someCondition)))
{
return someValue;
}
else if (x == 5)
{
return someValue / 12;
}
else if (x == 6)
{
return someValue * 12;
}
让我想想,你觉得这个怎么样
int someValue = 100;
if (x == 5)
return someCondition ? someValue : (someValue / 12);
else if (x == 6)
return someCondition ? (someValue * 12) : someValue;
这没有“嵌套”语句,因此在我看来更简洁:
int someValue = 100;
if ((x == 5 && someCondition) || (x == 6 && !someCondition))
return someValue;
if (x == 5)
return someValue / 12;
if (x == 6)
return someValue * 12;
您可以切换
if
语句,以便只重复该条件一次。您可以使用开关检查x
值:
int someValue = 100;
if (someCondition) {
switch (x) {
case 5: return someValue;
case 6: return someValue * 12;
}
} else {
switch (x) {
case 5: return someValue / 12;
case 6: return someValue;
}
}
真是太多了,怎么样
Double scalar = 12;
switch(x)
{
case 5 :
scalar = 1f/12;
break;
case 6 :
break;
default :
return 100;
}
if (someCondition)
{
return someValue;
}
return someValue * scalar;
一行代码:
condition ? someValue * ((x == 6) ? 12 : 1) : someValue / ((x == 5) ? 12 : 1);
这简单吗?我想是的。
这容易阅读吗?在某种程度上。
这样好吗?我不这么认为。(+生成的IL略有不同)使用对象而不是开关,添加了“采用”测试
const state={
5: {
真:(someValue)=>someValue,
false:(someValue)=>someValue/12
},
6: {
真:(someValue)=>someValue*12,
false:(someValue)=>someValue
}
}
常量测试值=[0,-1,1,12,-12,1.2,-1.2]
test_values.map(value=>Object.keys(state).map(x=>Object.keys(state[x]).map(condition=>{
log(`value=${value},x=${x},result=${state[x][condition](value)}`)
})))
您能为涉及的变量提供更多的语义名称吗?可能有一种方法可以简化这个过程,只有当我们能够理解代码的目的时才有意义。我唯一能看到的是,如果(x==6)我经常得到完全相同的IFs,我会在前面加上一个else。你对冗长的内容无能为力:)嗯,是的,比我的好+1:)可读性的一个经验法则是在一个表达式中最多使用一个条件。这是一个单行命令,但我发现这比公认的答案更难理解。
condition ? someValue * ((x == 6) ? 12 : 1) : someValue / ((x == 5) ? 12 : 1);
switch(x) {
case 5: return someCondition ? someValue : someValue / 12;
case 6: return someCondition ? someValue * 12 : someValue;
}