使用Redim来设置数组数据types

当我第一次创build一个数组时,我知道最好设置数据types,因为默认的Varianttypes是很慢的,而且最好在VBA中避免

我注意到了

 Redim t(1 To 10) As String 

似乎有同样的效果

 Dim t() As String Redim t(1 To 10) 

但我想知道 第一个选项首先将t()转换为Variant然后转换为String ,浪费内存与双重写? 或者是第二个选项实际上由于2行而变慢。 什么实际上发生在内存中时,我Dim的数组,而不指定其大小?

当然

 Dim t(1 To 10) As String 

遇到最有效的,但我需要Redim Preserve它后来无论如何,所以不能这样做。

什么实际上发生在内存中时,我Dim的数组,而不指定其大小?

你得到一个未初始化的, dynamic大小的数组 :VBA“在内存中保留一个点”。 究竟是如何工作的,只有微软才能解决的内部pipe道问题 – 除非你能反向工程师P代码(假设你可以提取编译后的P代码)。

DimReDim 都可以作为声明性语句 – 并不意味着他们都应该 – 从MSDN (重点是我的):

如果ReDim声明的variables在模块级别或过程级别上不存在,ReDim语句将作为声明性语句。 如果稍后创build具有相同名称的另一个variables,即使在更广的范围内,即使Option Explicit有效,ReDim也会引用后面的variables,并不一定会导致编译错误。 为了避免这种冲突, ReDim不应该被用作声明性声明,而只是用于重新定义数组


当你说:

或者是第二个选项实际上比较慢,因为2行。

你忘记了Dim不是一个可执行的语句(你不能在一个Dim语句中断)。 ReDim是。 因此,就运行时而言,两个“选项”基本相同,只是第一个(用ReDim作为声明语句)违背了最佳实践。

因此,如果您需要dynamic数组,请使用Dim声明一个dynamic数组:

 Dim foo() As String 

然后当你需要调整它的大小,使用ReDim来做到这一点:

 ReDim foo(1 To bar) 

作为一个经验法则,您不必担心Dim是否比ReDim更高效,或者反过来说 – 如果您的代码存在性能问题,则可能会出现99.9999999997%的概率,问题出在您的algorithm上,而不是VBA如何实现variables和数组分配。