关于使用块返回的最佳实践

时间:2009-08-03 18:24:33

标签: c# coding-style using-statement

哪种方式更好的做法:从using语句中的方法返回一个值或者之前声明一个变量,将其设置在内部并在之后返回?

public int Foo()
{
  using(..)
  {
     return bar;
  }
}

public int Foo()
{
  var b = null;
  using(..)
  {
    b = bar;
  }
  return b;
}

7 个答案:

答案 0 :(得分:9)

我更喜欢第一个例子。更少的变量,更少的代码行,更容易遵循,更容易维护...

public int Foo()
{
  using(..)
  {
     return bar;
  }
}

答案 1 :(得分:5)

遵循“少即是多”原则(实际上只是KISS的变体),前者。维护的代码行数较少,语义没有变化,可读性也不会降低(可以说这种风格更易于阅读)。

答案 2 :(得分:5)

来自using Statement - MSDN

  

using语句确保了这一点   即使异常,也会调用Dispose   在调用方法时发生   在对象上。你可以实现   通过放置对象得到相同的结果   在try块内,然后调用   处理finally块;事实上,   这就是using语句的用法   由编译器翻译。

来自try-finally (C# Reference)

  

终于用来保证了   语句代码块执行   ,无论退出前面的try块如何。

要回答你的问题,是的,可以从使用声明中返回。

答案 3 :(得分:3)

第二个显然更好,您可以通过编写测试程序来验证它是否正常工作。

using语句本身不能有值,这是一个限制。假设您有一个名为Open的方法,它返回一个打开的FileStream,并且您想要获取文件的长度:

Console.WriteLine(Open().Length);

存在的问题是您没有处置FileStream。所以你必须写(类似于你的例子):

long length;

using (FileStream file = Open())
    length = file.Length;

Console.WriteLine(length);

但是使用simple extension method,您可以改为编写:

Console.WriteLine(Open().Use(file => file.Length));

漂亮而整洁,FileStream被妥善处理。

答案 4 :(得分:2)

没有理由不将using语句转换为try...finally块,并且保证finally部分被执行(即使通过返回或未处理的异常)。

答案 5 :(得分:1)

这真的取决于个人偏好。你会在这个特定的围栏的两边找到论据。我自己,我赞成选项1:尽快回来。我相信它更好地表达了代码的意图;没有理由比你必须坚持更长时间。如果您已完成所有工作,请返回。

有时,您将拥有多个可能的返回点,并且“方法结束”工作(日志记录,清理)可能会导致您返回单个返回语句。没有什么可怕的,但你经常可以在finally块或面向方面编程的方面处理这些情况。

答案 6 :(得分:1)

我觉得第二个更好

public int Foo()
{
  using(..)
  {
     return bar;
  }
}

使用这种方式时出现的一件事是我们在使用之间返回,所以对象(我们已经包装使用)将被处理掉,答案是肯定的 因为using语句只是try / finally块的混合,所以也可以从try块返回。返回表达式将被计算,然后finally块将被执行,然后该方法将返回。所以前进:)