在C#方法中声明返回变量与直接返回值


17

在关于返回变量的辩论中,团队中的某些成员更喜欢将结果直接返回给调用者的方法,而另一些成员则更喜欢声明一个返回变量,然后将其返回给调用者(请参见下面的代码示例)

后者的论点是,它允许正在调试代码的开发人员在方法返回给调用者之前找到方法的返回值,从而使代码更易于理解:对于以菊花链方式进行的方法调用,尤其如此。

是否有关于哪种方法最有效的准则和/或是否有其他原因导致我们应采用一种风格而不是另一种风格?

谢谢

    private bool Is2(int a)
    {
        return a == 2;
    }

    private bool Is3(int a)
    {
        var result = a == 3;
        return result;
    }

11
两个示例都将编译为相同的IL。您想要第二个示例的唯一原因是出于调试目的,或者是否需要result在返回之前使用它。
克里斯·

1
另一个原因是因为您需要在计算结果和返回结果之间做其他事情。
tdammers 2012年

1
@ChrisF,其实他们不编译相同的IL对我来说(有额外的stloc.0ldloc.0在第二版)。但是我认为只有在调试模式下才会发生这种情况。无论如何,这并不是很重要。
svick 2012年

@svick-好的-我应该在“发布模式”中添加;)
ChrisF

1
由于您可以并且有时应该(为了简洁起见)编写类似于:a = b = c;和的内容a == b == c,因此,a = b == c如果可以的话,我将避免编写类似于外观的内容。当我第一次看到这样的代码行时,我花了几秒钟来弄清楚发生了什么。该代码脱颖而出。我想在括号里a == 3打上一点,但是StyleCop不喜欢它-使用第一个版本的充分理由。其他:这实际上是lambda,例如a => (a == 3)。为什么要在已经肿的琐碎函数中添加一行代码?
Job

Answers:


7

因为我在Visual Studio中使用了Resharper,所以Ctrl-RV(或Ctrl-Alt-V,如果您使用Resharper / IntelliJ键绑定)可以将第一个示例转换为第二个示例。因此,当我想调试时,我可以很容易地做到这一点。而且,如果我忘记放回去,那么我不会感到难过,因为Ctrl-RI会再次放回去以使其更易于阅读。

认真地,浪费时间争论更重要的事情。例如在哪里放置大括号或空格与制表符。


5
我希望辩论围绕不可见的角色……
ChaosPandion

提示,伙计们!现在,我们可以比以前更快地继续重构彼此的代码。与实际讨论相比,它可能节省更多时间!:)
pb01 2012年

@pdr ctrl + RV是否仅与reshaper一起使用?还是某种自定义按键绑定?它对我不起作用。
Jane Doe 2013年

@JaneDoe:我很惊讶地发现这是Resharper重构,而VS没有等效项。答案已更正。对于那个很抱歉。
pdr 2013年

@ChaosPandion U + 200B赢了!
Jesse C. Slicer,

18

我个人认为第一个示例更易于阅读。您仍然可以通过在return语句中设置断点并添加a == 2到监视窗口或使用快速监视来调试它。

但这确实是个人喜好问题。两种版本都可以。


8
+1扶正难以阅读的代码,使将破发点更容易被处事以错误的方式恕我直言
JK。

监视窗口或中间窗口并不总是解决此问题的方法,因为有时表达式需要运行线程。
JustAnotherUserYouMayKnowOrNot 2013年

@JustAnotherUserYouMayKnowOrNot:是的。还可以从断点内将消息打印到调试窗口中。右键单击断点,然后选择“ When Hit ...”。
Olivier Jacot-Descombes 2013年

该表达式也可能有副作用,再次运行它可能会导致问题。最好坚持使用结果var。
JustAnotherUserYouMayKnowOrNot

9

当代码像您的示例一样容易阅读时,返回逻辑操作(例如)的结果没有错return a == 2。但是,如果返回值是更复杂的语句或类似

return a > 2? doOptionA().getResult() > makeDecision("greaterThan2") : doOptionB().getResult() == makeDecision("lessThan2");

那么出于可读性考虑,您将需要使用变量来首先存储变量并简化return语句。


2

在这样的简单示例中,任何一个都可以。

对于更复杂的示例,我更喜欢第二种方法。那只是因为它更具可读性,其他人可能必须维护代码。


仅当变量名比更好时,变量名result本身才是完全非描述性且无用的标识符。
亚历山大-恢复莫妮卡
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.