好的,我正在使用我们在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?
答案 0 :(得分:8)
清理评论后的语句将不会执行。这是Try / Catch / Finally中的封闭候选者。
答案 1 :(得分:1)
除非您的示例中省略了某些控制逻辑
答案 2 :(得分:1)
使用try catch异常将代码(清理)包装在finally语句中:
伪:
try
'make conn
catch exception
finally
mysqlCmd.Dispose
....
end try
它是否有可能它仍然会运行......可能......我曾经写过VB.net并且它已经有一段时间但我确实记得那样的古怪。我不能给你一个肯定的答案,因为这是非常糟糕的做法。你可以做的就是清理它并在我们的代码和调试中设置一些断点。看看代码是否回归......
答案 3 :(得分:1)
简答:返回下面的代码永远不会执行。
看起来像翻译的代码。就像有人从网上拿了一个C#片段并尝试在VB for VS 2003中编写它(在VB支持USING语句之前,但是在C#之前)。
新的MySqlConnection和MySqlCommand应该放在USING块中,Dispose()行变成END USING。尽可能使用USING over 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语句。
答案 4 :(得分:0)
对我来说这是一个巨大的WTF并且很难错过,通常同行代码审查可以捕捉到这一点,我不明白为什么在清理之前早些时候从函数返回。这可能是在程序员想要首先测试函数的代码测试期间完成的,并且决定通过快速返回来忽略清理代码,我怀疑清理代码可能很长,即。也许是抛出一个没有被正确捕获的异常并且想要忽略它因此需要立即返回...这是引入泄漏的(非)故意副作用,因为资源没有被正确清理,从而掩盖了真实问题......这是我的看法。
希望这有帮助, 最好的祝福, 汤姆。
答案 5 :(得分:0)
返回语句后,所提供的代码不会执行任何操作。 VB.NET和C#在这种方式上是相似的。
这个代码可能是由VB6程序员编写的,信任旧的范例,或者这可能是升级工具的工作,将代码从VB6移植到VB.NET。