8

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

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

或者

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

7 回答 7

9

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

public int Foo()
{
  using(..)
  {
     return bar;
  }
}
于 2009-08-03T18:27:40.407 回答
5

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

于 2009-08-03T18:29:31.837 回答
5

使用语句 - MSDN

using 语句可确保调用 Dispose,即使在调用对象上的方法时发生异常也是如此。您可以通过将对象放在 try 块中,然后 在 finally 块中调用 Dispose 来获得相同的结果;事实上,这就是编译器翻译 using 语句的方式。

来自try-finally(C# 参考)

finally 用于保证语句块的执行 ,而不管前面的 try 块如何退出。

要回答您的问题,是的,可以从 using 语句中返回。

于 2009-08-03T18:29:40.930 回答
3

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

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

Console.WriteLine(Open().Length);

那里的错误是您没有处理FileStream. 所以你必须写(类似于你的例子):

long length;

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

Console.WriteLine(length);

但是使用一个简单的扩展方法,你可以这样写:

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

漂亮整洁,并且FileStream得到妥善处理。

于 2009-08-03T18:36:37.750 回答
2

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

于 2009-08-03T18:27:09.267 回答
1

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

有时,您将有多个可能的返回点,并且“方法结束”工作(记录、清理)可能会将您引导至单个返回语句。这没什么可怕的,但是您通常可以在finally块中或在面向方面的编程中使用方面来处理这些情况。

于 2009-08-03T18:28:23.010 回答
1

我觉得第二个更好

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

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

于 2009-08-05T15:14:45.480 回答