我经常看到代码示例,这些代码示例经历了对象变量的声明,设置,调用和任何相关清理的繁琐且可能令人困惑的过程,否则,在没有变量的情况下工作正常 - 最重要的是,在该函数专用的变量。
在撰写完整参考资料时,这一点是否真的有必要呢?
我听说过,代码更容易阅读,运行速度更快。前者是高度主观的,后者,我还没有真正注意到。
实例;
Public Sub TransactionExample()
Dim wrkSpaceVar As DAO.Workspace
Dim dbVar As DAO.Database
Set wrkSpaceVar = DBEngine(0)
Set dbVar = CurrentDb
On Error GoTo trans_Err
wrkSpaceVar.BeginTrans
dbVar.Execute "SomeActionQuery", dbFailOnError
dbVar.Execute "SomeOtherActionQuery", dbFailOnError
wrkSpaceVar.CommitTrans
trans_Exit:
wrkSpaceVar.Close
Set dbVar = Nothing
Set wrkSpaceVar = Nothing
Exit Sub
trans_Err:
wrkSpaceVar.Rollback
MsgBox "Transaction failed. Error: " & Err.Description
Resume trans_Exit
End Sub
VS
Public Sub TransactionExample()
On Error GoTo trans_Err
DAO.DBEngine.BeginTrans
CurrentDb.Execute "SomeActionQuery", dbFailOnError
CurrentDb.Execute "SomeOtherActionQuery", dbFailOnError
DAO.DBEngine.CommitTrans
Exit Sub
trans_Err:
DAO.DBEngine.Rollback
MsgBox "Transaction failed. Error: " & Err.Description
End Sub
我不是要求将变量设置为“Nothing”;我问他们是否有必要。并且,在所提供的示例的范围内,必要是值得的。
答案 0 :(得分:2)
简而言之,不 - 没有必要将它们存储在局部变量中,因为两个代码示例中的引用都是相同的。您将设置为局部变量的原因是为了避免必要的对象解除引用调用。在您的示例中,DAO.DBEngine
被调用三次。每个实际上都是一个函数调用,它带有一些处理开销来检索你正在使用的对象引用。在您的顶部示例中,该函数调用仅在一次时进行,并且结果将缓存在局部变量引用中。
如果您不想声明局部变量,可以通过在With
块中包含使用相同引用的代码来执行相同的操作:
Public Sub TransactionExample()
With DBEngine(0)
On Error GoTo trans_Err
.BeginTrans
With CurrentDb
.Execute "SomeActionQuery", dbFailOnError
.Execute "SomeOtherActionQuery", dbFailOnError
End With
.CommitTrans
trans_Exit:
.Close
Exit Sub
trans_Err:
.Rollback
MsgBox "Transaction failed. Error: " & Err.Description
Resume trans_Exit
End With
End Sub
除非你正在做大量的工作(即广泛地进行循环),否则无论你使用哪种方法,性能差异都可以忽略不计。
注意 - 无需将变量设置为Nothing
。运行时会在离开范围时处理它。