在编译VBA代码时处理Dim语句是什么时候?如果我这样做,是否会提高效率?:
Dim oFileDiag As FileDialog
Set oFileDiag = Application.FileDialog(msoFileDialogFilePicker)
If oFileDiag.Show = -1 Then
'// Dim statement further down in the code...
Dim ofdSelected As FileDialogSelectedItems
Set ofdSelected = .SelectedItems
End If
与此相反?:
'// Dim statement at the beginning of the code...
Dim oFileDiag As FileDialog
Dim ofdSelected As FileDialogSelectedItems
Set oFileDiag = Application.FileDialog(msoFileDialogFilePicker)
If oFileDiag.Show = -1 Then
Set ofdSelected = .SelectedItems
End If
答案 0 :(得分:3)
据我所知(之前我错了),VB(A)的效率没有提高。在例程中的任何地方声明任何变量将使用相同的资源(尽管您的变量不会可用直到其声明之下)。
对象变量(Dim
)的声明仅创建引用,它不会在Set
之前实例化对象。但是,请注意这种构造中的相反问题:
Dim rsFoo As New ADODB.Recordset
'other statements
With rsFoo
.LockType = adBatchOptimistic
'other statements
End With
这似乎很方便,因为你不必做一个明确的Set... = New...
。但问题是在运行时使用rsFoo
的每个时间代码必须检查它是否已被实例化。这样做好多了:
Dim rsFoo As ADODB.Recordset
'other statements
Set rsFoo = New ADODB.Recordset
With rsFoo
.LockType = adBatchOptimistic
'other statements
End With
这在某种程度上是一种“宗教”差异,至少在开销没有任何实际差异的语言中是这样。 VB(A)中最常见的做法是在例程的开头声明所有变量,尽管有些人认为保持声明尽可能接近第一次使用是“更清楚”(不是我们这些人条件是在开始时期望它们全部,它不是......)。
答案 1 :(得分:0)
受过教育的猜测:这不会有任何区别,但是,来自C的prgrammers保持习惯在代码/函数的开头声明所有变量。
答案 2 :(得分:0)
我会说轻微,但因为它是您永远不会注意到的交互式用户界面的一部分。
这实际上是Scott Meyers的一本有效C ++书籍中的一个提示,它阻止变量声明直到最后一刻,以避免不必要的构造函数开销,如果(在这种情况下)你根本不需要基于失败的对象条件。
我认为这在VB中是类似的。 Dim ofdSelected As FileDialogSelectedItems
是否实例化对象或仅声明引用?