Jus*_*ner 0 c# visual-studio-2008 visual-studio
我想在if语句中重新排序子表达式.这是一个例子:
输入:
if ((a == 1) || (a == 3) || (a == 2))
{
}
Run Code Online (Sandbox Code Playgroud)
期望的输出:
if ((a == 1) || (a == 2) || (a == 3))
{
}
Run Code Online (Sandbox Code Playgroud)
有没有可以自动重新排序这些子表达式的工具?
或者以下相同的代码:
输入:
switch (a)
{
case: 1;
case: 3:
case: 2;
break;
}
Run Code Online (Sandbox Code Playgroud)
期望的输出:
switch (a)
{
case: 1;
case: 2:
case: 3;
break;
}
Run Code Online (Sandbox Code Playgroud)
澄清:
我的问题不是解决短路问题.这是一个有用的讨论,正如Reed所指出的,在大多数情况下重新排序参数是危险的.
如果解析诸如ReSharper或Code Rush之类的工具具有此功能,我只是很好奇.这些工具可能会创建一个AST来执行它们的重构,并且对它们重新排序子表达式也不会太困难.
我不知道会自动执行此操作的工具,至少在"if"语句中是这样.
一般来说,如果工具自动执行此操作会很糟糕.以下两个语句的行为不同:
if ((a == 1) && (b == 3) && (c == 2))
Run Code Online (Sandbox Code Playgroud)
和
if ((a == 1) && (c == 2) && (b == 3))
Run Code Online (Sandbox Code Playgroud)
在第一种情况下,如果b!= 3,但a == 1,它将检查a,然后检查b,然后跳过该块.
在第二种情况下,它会检查a,然后检查c,然后检查b.你失去了检查短路的能力.
当然,在大多数情况下,这并不重要,但是当您使用方法而不是a/b/c的值时,它可能会很昂贵.
编辑:我看到您已更新为使用OR而不是AND.OR存在同样的问题,除了在第一个条件为真时发生短路,而不是在第一个条件为假时发生.