【问题标题】:Best practice regarding returning from using blocks [duplicate]从使用块返回的最佳实践[重复]
【发布时间】:2010-11-16 11:15:19
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# coding-style using-statement


    【解决方案1】:

    我感觉第二个更好

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        来自using Statement - MSDN

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

        来自try-finally (C# Reference)

        finally 用于保证一个 语句块代码执行 不管前面的 try 块是如何退出的。

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

        【讨论】:

        • 他问上面哪个是更好的实践,而不是为了 using 语句的语义。可以说语义在这里是相关的,但它没有回答提出的问题。
        • @Jason:很公平……问题的标题是“可以从 using 语句中的方法返回吗?” ..你可以看到我不是唯一一个以这种方式阅读问题的人。
        • @Stan R:我看到了混淆的可能性,但帖子显然是在询问最佳实践,而不是 finally 块是否会执行(即语义)。
        【解决方案4】:

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

        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 得到妥善处理。

        【讨论】:

        • 整洁,但同时不可读:-)
        • 嘿,这很整洁。谢谢一个聪明的主意。
        • @Scott P - 它本质上与? : 运算符(一个“表达式”等价于if)的想法相同。有些人发现? : 的可读性不如if 等价的语句,我发现它有时会更清晰。消除变量名通常有助于清晰。
        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

          • 我同意个人喜好。我更喜欢在方法的底部/末尾返回。编码指南也经常规定这一点。这也可能是因为方法有时太长,导致方法不可读。保持它们非常简短,并且您的方法再次可读。所以这是我猜的那些“取决于”答案之一! ;) 从最佳实践来看,afaik 真的没有,这更像是一个偏好问题。
          【解决方案7】:

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

          【讨论】:

          • 总要有人指出这一点——finally 块是“保证”被执行的。在某些明确定义的情况下它会执行,而在其他情况下则不会。
          • 有一些不会的例子吗?
          • @Earwicker:如果它不会被执行的情况达到
          • 从 C# 参考中查看 Stan R 的引述,您似乎错了。
          • 保证以同样的方式运行任何其他代码保证运行。
          猜你喜欢
          • 1970-01-01
          • 2019-09-01
          • 2022-06-15
          • 1970-01-01
          • 1970-01-01
          • 2014-06-16
          • 2015-09-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多