C# 如何在Visual Studio中重新排列子表达式?

C# 如何在Visual Studio中重新排列子表达式?,c#,visual-studio,visual-studio-2008,C#,Visual Studio,Visual Studio 2008,我想对if语句中的子表达式重新排序。以下是一个例子: 输入: if ((a == 1) || (a == 3) || (a == 2)) { } if ((a == 1) || (a == 2) || (a == 3)) { } switch (a) { case: 1; case: 3: case: 2; break; } 所需输出: if ((a == 1) || (a == 3) || (a == 2)) { } if ((a == 1) || (a

我想对if语句中的子表达式重新排序。以下是一个例子:

输入:

if ((a == 1) || (a == 3) || (a == 2))
{
}
if ((a == 1) || (a == 2) || (a == 3))
{
}
switch (a)
{
    case: 1;
    case: 3:
    case: 2;
    break;
}
所需输出:

if ((a == 1) || (a == 3) || (a == 2))
{
}
if ((a == 1) || (a == 2) || (a == 3))
{
}
switch (a)
{
    case: 1;
    case: 3:
    case: 2;
    break;
}
是否有任何工具可以自动对这些子表达式重新排序

或以下相同代码:

输入:

if ((a == 1) || (a == 3) || (a == 2))
{
}
if ((a == 1) || (a == 2) || (a == 3))
{
}
switch (a)
{
    case: 1;
    case: 3:
    case: 2;
    break;
}
所需输出:

switch (a)
{
    case: 1;
    case: 2:
    case: 3;
    break;
}
澄清:

if ((a == 1) || (a == 3) || (a == 2))
{
}
if ((a == 1) || (a == 2) || (a == 3))
{
}
switch (a)
{
    case: 1;
    case: 3:
    case: 2;
    break;
}
我的问题没有解决。这是一个有用的讨论,正如里德指出的那样,在大多数情况下重新排序参数是危险的


我只是好奇诸如ReSharper或Code Rush之类的解析工具是否具有这种功能。这些工具可能会创建一个AST来执行重构,并且对子表达式进行重新排序也不会太困难。

我不知道有哪种工具会自动执行此操作,至少在“if”语句的情况下是这样的

一般来说,如果工具自动执行此操作,那将是不好的。以下两个语句的行为不同:

if ((a == 1) && (b == 3) && (c == 2))

在第一种情况下,如果b!=3,但a==1,它将检查a,然后检查b,然后跳过该块

在第二种情况下,它将检查a,然后检查c,然后检查b。你将失去短路检查的能力

当然,在大多数情况下,这并不重要,但是当您使用方法而不是a/b/c的值时,这可能会很昂贵



编辑:我看到您已更新为使用或代替和。OR也存在同样的问题,除了短路会发生在第一个条件为真时,而不是第一个条件为假时。

我同意里德·科佩的答案。但是,由于还没有人提到这一点:


根据您使用的语言,
开关
语句的行为与
if
/
elsif
/
else
不同。我知道对于C、Java等,它们使用分支表来确定应该执行什么。(对PHP之类的东西不太确定。)如果你想读更多的话,上面提到过它。

我希望那些if语句只是快速键入的示例:o)是的,我猜它应该是((a==1)&(c==3)&&(b==2)),或者类似的东西-否则,它总是错误的,没有一个真正扭曲的对等推进…很好的观点,我甚至没有考虑短路行为的变化。与| | isntead&&.Justin完全相同的问题,即使使用A,你仍然会失去短路。正是因为这个原因,最好把你最常用的支票放在第一位。