【问题标题】:Will statements or expressions execute after a return statement in VB.net?语句或表达式会在 VB.net 中的 return 语句之后执行吗?
【发布时间】:2010-02-03 07:41:14
【问题描述】:

好的,我正在研究我们公司的一个应用程序,它是在 VB.net 中完成的。我不熟悉 VB.net(我用 C# 做东西)所以我问这个问题:清理注释后的代码是否执行?

Public Function DoesUserHavePermission(ByVal UserID As Integer, ByVal ActionID As Integer) As Boolean
    ' some extra code re: getting data


     Return UserHasPermission

     '-Clean Up-
     MySqlCommand.Dispose()
     MySqlConnection.Dispose()
     RowCount = Nothing


End Function

我的理解是,一旦你说返回,你又给了调用函数控制权。这是我必须接受的 VB.Net 怪事还是巨大的 WTF?

【问题讨论】:

  • 绝对是个 wtf..可能是一个新程序员或实习生,在不了解 .net 的情况下被扔进了 .net...
  • 是的,看起来像 OMFG WTFAYT。

标签: vb.net


【解决方案1】:

Clean up 注释后的语句不会执行。这是 Try/Catch/Finally 中的封闭候选。

【讨论】:

  • 我就是这么想的。 VB.net 很奇怪,我不得不问这个问题。
  • Using 如果变量是本地的
【解决方案2】:

除非您在示例中省略了一些控制逻辑

【讨论】:

    【解决方案3】:

    代码应该(即清理)使用 try catch 异常包裹在 finally 语句中:

    伪:

    try
      'make conn
    catch exception
    finally
    mysqlCmd.Dispose
    ....
    end try
    

    它是否可能仍会运行..可能...我曾经写过 VB.net,已经有一段时间了,但我确实记得这样的怪事。我不能给你一个肯定的答案,因为这是 / 是非常糟糕的做法。您可以做的是清理它并在我们的代码和调试中设置一些断点。看看代码是否返回它...

    【讨论】:

      【解决方案4】:

      简答:return 下面的代码永远不会执行。

      这看起来像是翻译后的代码。就像有人从网上拿了一个 C# sn-p 并尝试在 VB 中为 VS 2003 编写它(在 VB 支持 USING 语句之前,但 C# 支持)。

      MySqlConnection 和 MySqlCommand 的新位置应该放在 USING 块中,并且 Dispose() 行变成 END USING。

      在可能的情况下,使用 USING 而不是 TRY/FINALLY 以确保清除 IDisposable 对象。

      using mySqlConnection as New SqlConnection(connectionString)
          mySqlConnection.Open
          using mySqlCommand as New SqlCommand(commandString, mySqlConnection)
             'do something that may fail'
      
             return UserHasPermission
      
          end using 'disposes mySqlCommand'
      end using 'closes/disposes mySqlConnection'
      

      您也可以将此模式用于 SqlTransactions。 (放在 mySqlConnection.Open 之后)

      using myTerribleVariableName as SqlTransaction = mySqlConnection.BeginTransaction
          'do something that may fail - multiple SqlCommands maybe'
          'be sure to reference the transaction context in the SqlCommand'
      
          myTerribleVariableName.Commit
      end using 'disposes. rollsback if not commited'
      

      哦,您可以删除 RowCount = Nothing 语句。

      【讨论】:

        【解决方案5】:

        这对我来说是一个巨大的 WTF 并且很难错过,通常同行代码审查可以捕捉到这一点,我不明白为什么在清理之前将函数的返回放在更早的位置。这可以在程序员想要首先测试函数并决定通过足够快地返回来忽略清理代码的代码测试期间完成,我怀疑清理代码可能很长,即。也许它抛出了一个没有正确捕获的异常并且想要忽略它,因此需要立即返回......这是引入泄漏的(非)故意副作用,因为资源没有被正确清理,从而掩盖了真实的问题...这是我的看法。

        希望这会有所帮助, 此致, 汤姆。

        【讨论】:

          【解决方案6】:

          呈现的代码在 return 语句之后不会做任何事情。 VB.NET 和 C# 在这种方式上是相似的。

          这段代码可能是由 VB6 程序员编写的,相信旧范式,也可能是升级工具的工作,将代码从 VB6 移植到 VB.NET。

          【讨论】:

          • 这是 VB6 的功能吗?不,这是新的代码库。但是负责的程序员是VB6背景的。
          • 是的,你可以在 VB6 中解决这个问题。我也不认为这是一个好主意。
          • 在 VB6 中你无法摆脱它。无法访问的代码不会执行。尽管 VB6 具有确定性的终结性,但有时并不需要处理资源。
          • VB6 中没有Return,所以等价的应该是DoesUserHavePermission = UserHasPermission,然后执行清理代码。所以据我所知,它在 VB6 中是“正常的”。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-19
          • 1970-01-01
          • 1970-01-01
          • 2022-01-07
          • 1970-01-01
          • 2015-01-12
          相关资源
          最近更新 更多