写这个if..then逻辑的最干净的方法是什么?

时间:2009-01-29 21:50:59

标签: c# coding-style

他们都做同样的事情。一种方式更好吗?显然,如果我编写代码,我会知道我做了什么,但其他人如何阅读呢?

if (!String.IsNullOrEmpty(returnUrl))
{
    return Redirect(returnUrl);
}
return RedirectToAction("Open", "ServiceCall");

OR

if (!String.IsNullOrEmpty(returnUrl))
{
   return Redirect(returnUrl);
}
else
{
    return RedirectToAction("Open", "ServiceCall");
}

17 个答案:

答案 0 :(得分:30)

return String.IsNullOrEmpty(returnUrl) ? 
            RedirectToAction("Open", "ServiceCall") : 
            Redirect(returnUrl);

我更喜欢。

或替代方案:

return String.IsNullOrEmpty(returnUrl)  
            ? RedirectToAction("Open", "ServiceCall")  
            : Redirect(returnUrl);

答案 1 :(得分:24)

我认为最好删除not(否定)并首先得到肯定的断言:

if (String.IsNullOrEmpty(returnUrl))
{
   return RedirectToAction("Open", "ServiceCall");
}
else
{
    return Redirect(returnUrl);
}

- 或 -

// Andrew Rollings solution
return String.IsNullOrEmpty(returnUrl) ? 
                    RedirectToAction("Open", "ServiceCall") : 
                    Redirect(returnUrl);

答案 2 :(得分:21)

一种风格问题:

if (String.IsNullOrEmpty(returnUrl))
{
    return RedirectToAction("Open", "ServiceCall");
}
return Redirect(returnUrl);

当您取消双重否定时,无论您选择哪种支撑方式,它都会读得更好。读得更好的代码总是最好的;)

答案 3 :(得分:9)

我认为这是一个相当小的风格问题。我认为你的两个样本同样可读。

我更喜欢前者,但其他人更喜欢功能的一个退出点,并且可能会提出类似的建议:

if (!String.IsNullOrEmpty(returnUrl))
{
   result = Redirect(returnUrl);
}
else
{
    result = RedirectToAction("Open", "ServiceCall");
}

return result;

答案 4 :(得分:9)

第二种方式更好,没有混淆你的意思......

答案 5 :(得分:5)

我喜欢第一个例子,因为这段摘录更明显。如果两个return都在缩进的块中,那么需要花费更多精力去辨别。

答案 6 :(得分:1)

这段代码因为不可避免的双重负面逻辑而感到凌乱(而且随之而来的东西也不会清除它)。无论您使用哪种安排,我认为您应该添加一些注释,以便读者不需要进行双重操作:

if (!String.IsNullOrEmpty(returnUrl))
{
  // hooray, we have a URL
  return Redirect(returnUrl);
}
else
{
  // no url, go to the default place
  return RedirectToAction("Open", "ServiceCall");
}

答案 7 :(得分:1)

如果它是整个方法,那么我会说第二个(使用else)更优雅一点。如果你在else的情况下返回之前有代码或(特别是)更多的代码,我会说最好不要把else。保持代码变得过于缩进。

即。之一:

void myfunc()
{
    if (!String.IsNullOrEmpty(returnUrl))
    {
        return Redirect(returnUrl);
    }
    else
    {
        return RedirectToAction("Open", "ServiceCall");
    }
}

void myfunc()
{
    // ... maybe some code here ...

    if(!String.IsNullOrEmpty(returnUrl))
    {
       return Redirect(returnUrl);
    }

    // ... a bunch of other code ...

    return RedirectToAction("Open", "ServiceCall");
}

答案 8 :(得分:1)

消除'双重否定'并使用完全展开的风格。我相信大多数编译器现在可以代表您适当地优化代码,因此没有理由采用捷径来提高可读性。

答案 9 :(得分:0)

我更喜欢第一个。

if ( ) 
{
    return ... 
}
return 

对我来说,它看起来像一个“默认”,你可以链接更多的条件,但最后有一个默认值。

当然这是一种风格问题。

其他问题。

将方括号放在一行中是否为C#样式?

if ( ) 
{
}
else
{
}

我已经看到这在SO中渗透到Java代码示例中,我想知道这是根本原因。

修改

@Owen。 我的意思是,使用这种形式是C#风格吗?

if ()  
{
    code ... 
}
else
{
    code...
}

而不是这个(Java preffered

if ( ) { 
    code ... 
} else { 
   code ...
}

我过去曾就此有过一些争论,但大多数时候,只有来自C#背景的人。

答案 10 :(得分:0)

不要认为有更好的方法......它取决于每个开发人员。这就是为什么在开始一个项目之前你应该决定什么是编码标准......

答案 11 :(得分:0)

作为here,但更具可读性:

return
  string.isNullorEmpty(returnUrl) ? 
     RedirectToAction("Open", "ServiceCall") :
     Redirect(returnUrl);

这种方式有效,可读且无冗余。

答案 12 :(得分:0)

从维护角度来看,我更喜欢第一个版本。我已经看到较少的错误与一致的“早出”风格。

三元运算符(?:)没问题,但只有在第二个返回语句之前插入新代码的可能性很小。否则,当需要在第二个代码路径中添加新内容时,三元语句必须回到if / else块。

答案 13 :(得分:0)

当我只有一行时,我会压缩if语句:

if(String.IsNullOrEmpty(returnUrl)) { 
  return RedirectToAction("Open", "ServiceCall"); 
}
else{ return Redirect(returnUrl); }

虽然当我看到它时,Andrew Rollings可能有最好的解决方案,尽管直到今天我才想到使用它。

答案 14 :(得分:0)

LFSR的"else" solution是最易于维护和可读的。

使用单独的else子句允许添加逻辑而不会无意中更改流。并且它有足够多的退出点而不会在一个三元运算符语句中隐藏其中的两个!

答案 15 :(得分:0)

怎么样:

if (!String.IsNullOrEmpty(returnUrl))
    return Redirect(returnUrl);
else
    return RedirectToAction("Open", "ServiceCall");

答案 16 :(得分:-1)

第一个。如果要在if语句中返回值,则不需要任何其他内容。所以:

if (!String.IsNullOrEmpty(returnUrl))
    return Redirect(returnUrl);
return RedirectToAction("Open", "ServiceCall");