English 中文(简体)
否则或返回?
原标题:else or return?
  • 时间:2010-05-17 11:39:42
  •  标签:
  • c#
  • .net

下面二者中有一人是对业绩和标准做法的最大侵犯。 如何。 该网络内部处理这两个法典的刀子?

法典1

If(result)
{
  process1();
}
else
{
  process2();
}

第2条

If(result)
{
   process1();
   return;
}
process2();
最佳回答

在任何正常情况下,业绩差异微不足道。

一种标准做法(除其他做法外)是试图从一种方法中保留一个单一出点,以便谈判有利于第一种选择。

在中间对<代码>return的实际实施最有可能使该方法的末端出现跳跃,而关于该方法的打字框架的代码是这样,最终的可执行代码可能与这两项守则相同。

问题回答

我个人总是要回来,这样我就想像:

if (result)
{
    // do something
    return;
}

// do something if not result

在业绩方面,我怀疑,无论是哪一方都比另一方都拥有任何优势,而是真正做到可读性和个人信条。 我假定,“网络”将优化你的第一组代码,使之达到上述标准。

我认为,单一出境点已经过高。 定时太仓促,可能会导致某些非常复杂的法典,而实际上这些法典要么有多个出境点,要么分为较小的方法。

我要说,两者之间的选择取决于语义。

如果情况确实如此,否则地图就完全照样。

if (isLoggedIn) {
    RedirectToContent();
} else {
    RedirectToLogin();
}

如果有些条件允许的话,就会进行一些清理,并将地图更好地排到第2条。 这被称为守卫模式。 这使得该法典的体质尽可能正常、清晰、不必要地.。 它通常用于验证参数或状态(如果某种东西无效,或者有些事情如).)。

if (user == null) {
    RedirectToLogin();
    return;
}

DisplayHelloMessage(user.Name);

看到同一项目中使用的两种形式并不罕见。 正如我所说的那样,什么使用取决于你再次试图传达的东西。

如果存在共同的法典,则需要在选择1之后执行。

如果是哪类企业是履行某种职能的最后一件事,则选择2。

我本人总是使用选择1。 如果返回国,则是在其他障碍之后。

如果你去掉第2版周围的镜头,那就完全是我使用的。 我宁愿使早期验证部分成为一项职能的明显部分,然后我可以去做生意。

尽管如此,它还是提出了意见。 只要你对此持一致态度,就走了一条路,并坚持下去。

<<>strong>edit: 关于业绩,已申报的IL完全相同。 选择一种或另一种方式,对这两种情况都没有任何惩罚。

这两者将汇编成相同的释放模式(在Debug可能有几个不同的Nop剧)。 因此不会有业绩差别。 这完全取决于你和你的团队如何看待该守则。

我曾经在难民营中反对尽早撤离,但现在我感到,可以使守则更加简单。

// C#
public static void @elseif(bool isTrue)
{
    if (isTrue)
        Process1();
    else
        Process2();
}
// IL
.method public hidebysig static void  elseif(bool isTrue) cil managed
{
  // Code size       15 (0xf)
  .maxstack  8
  IL_0000:  ldarg.0
  IL_0001:  brfalse.s  IL_0009
  IL_0003:  call       void elseif.Program::Process1()
  IL_0008:  ret
  IL_0009:  call       void elseif.Program::Process2()
  IL_000e:  ret
} // end of method Program::elseif


// C#
public static void @earlyReturn(bool isTrue)
{
    if (isTrue)
    {
        Process1();
        return;
    }
    Process2();
}
// IL
.method public hidebysig static void  earlyReturn(bool isTrue) cil managed
{
  // Code size       15 (0xf)
  .maxstack  8
  IL_0000:  ldarg.0
  IL_0001:  brfalse.s  IL_0009
  IL_0003:  call       void elseif.Program::Process1()
  IL_0008:  ret
  IL_0009:  call       void elseif.Program::Process2()
  IL_000e:  ret
} // end of method Program::earlyReturn

可以说是业绩不佳,但第1号法律对我来说是更加清楚和更加符合逻辑的。 在“>>>>>>>>条码/代码”栏目中放弃功能似乎很混淆,很容易忽略。

http://www.c2.com/cgi/wiki?GuardClause” rel=“nofollow noretinger” http://www.c2.com/cgi/wiki?GuardClause。

我看不到一个词,即我认为很重要——警卫条款的目的是提高可读性。 单一退出方法可能倾向于采用“狭义”法(在加固发言后,arrow头).)。

返回将使《刑法》从任何一种方式返回,如果该声明有的话,则不会再执行任何法典。 如果没有回来的话,声明将完全删除。

我将使用<代码>Code 1,因为如果在if/code>说明之后添加一些内容,那么Im仍将执行,但我无需记住删除<代码>return。 载于<代码>的条款 准则2

这两种风格都很常见,宗教战争已经战胜。

我通常这样做:

  • If the test is expressing method contract semantics, e.g. checking input parameters for validity, then choose option 2.
  • Otherwise, choose option 1.

然而,可以说,一项更为重要的规则是“对研究守则的下一个开发商来说,这一规则更可读和(或)更可维持?

正如其他人所说的那样,业绩差异微不足道。

我认为,你应该对这方面的业绩表示担忧。 在这种情况下,可读性和可维持性更为重要。

例行公事的起点是良好做法。

然而,有时多重回报只会使守则更加清楚,特别是当你在守则的开始附近进行了一些测试(即检查所有投入参数是否都采用正确的格式),如果真实情况会导致回报。

即:

if (date not set) return false;
age = calculateAgeBasedOnDate();
if (age higher than 100) return false;
...lots of code...
return result;

I think it does not matter. You should go for readability and I think the less brackets the better. So I would return without the last 2 brackets (see sample below). Please do not think about performance when writing something like this it won t give you anything but too much complexity at an too early stage.

if(result)
{
  process 1
  return;
}

process 2

I think the second option is better for cases of many condition (such as validation). If you use the first in these cases you will get ugly indentation.

 if (con){
    ...
    return;
 }
 if (other con){
    ...
    return;
 }
 ...
 return;

我倾向于有一个单一的出境点,这对于在多面环境下设置路障非常有用,以确保释放锁。 随着第一次执行,这项工作更加困难。

I tend to have multiple points of exit from a function. Personally I think it s clearer and in some cases it can be faster. If you check on something and then return the program won t execute any left commands. Then again as HZC said if you work on multi-threaded applications then your best shot might be using your first example. Anyway for small pieces of code it won t make any difference(probably not even for some larger ones). Most important is that you write how you feel comfortable with.

如果我不得不说的话,我会说,更好的做法是,如果是,而不是“简单化”。 理由是,如果其他人修改你的法典,他们可以轻易地通过轮.来达到。

我回顾,在方案拟订世界中,就你是否应在你们的法典中发表多次回归声明进行了大量辩论。 人们可以说,这会造成很大的混乱,因为如果你在“如果”声明中有多个漏洞,并且有有条件的回报,那就会造成一些混乱。

我的惯常做法是发表一份“有选择的声明”和一份单一的返回声明。

例如,

type returnValue;
if(true)
{
 returnValue = item;
}
else
 returnValue = somethingElse;

return returnValue;

我认为,上述内容可以稍加读。 然而,情况总是如此。 有时,如果说话的话,最好在中间发表返回声明,特别是如果它需要trick的返回声明的话。

它取决于“结果”、“过程1”和“过程2”是什么。

如果程序2是“结果”的必然结果,那么就应当适用第1条。 如果程序1和过程2是同等的替代物,则这是最可读的模式。

if (do_A_or_B = A)
  A()
else
  B()

如果结果属于某种“非目标”条件,而“程序1”只是满足这种条件所需要的清理,那么你应当选择第2条。 如果“处理2”是该职能的主要行动,这是最可读的模式。

if (NOT can_do_B)
{
  A() 
  return
}

B()

它取决于具体情况。

如果这一功能在计算价值时,一经您(备选案文2)。 你正在表明,你已经做了你需要和将要完成的所有工作。

如果这是方案逻辑的一部分,则尽可能准确(备选方案1)。 想选择1的人会知道你的话(这句话就是说),如果选择2可能是错误的(在这种情况下,N ALWAYS就是这样做的——我对你来说是正确的!) 否则。

汇编这些内容通常相同,但我们对业绩不感兴趣。 这就是可读性和可维持性。





相关问题
Anyone feel like passing it forward?

I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...

NSArray s, Primitive types and Boxing Oh My!

I m pretty new to the Objective-C world and I have a long history with .net/C# so naturally I m inclined to use my C# wits. Now here s the question: I feel really inclined to create some type of ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

How to Use Ghostscript DLL to convert PDF to PDF/A

How to user GhostScript DLL to convert PDF to PDF/A. I know I kind of have to call the exported function of gsdll32.dll whose name is gsapi_init_with_args, but how do i pass the right arguments? BTW, ...

Linqy no matchy

Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...

热门标签