2016-06-30 11 views
1

背景:消去ReDimステートメントで配列対

私はちょうどthis questionに出くわしたと私は配列では約eraseなステートメントを学びました。

私は常にそれらをリセットするには、次を使用している:私は終わりに消去

Sub TestWithEraseAndRedim() 
Dim ExampleArray() As String 
    ReDim Preserve ExampleArray(1) 
    ExampleArray(1) = "yo" 
    MsgBox ExampleArray(1) 
    Erase ExampleArray 
    MsgBox ExampleArray(1) 'this confirms is reset! 
    ReDim ExampleArray(0) As String 
    MsgBox ExampleArray(1) 'this confirms is reset! 
End Sub 

でそれを行う場合

Sub TestWithRedimOnly() 
Dim ExampleArray() As String 
    ReDim Preserve ExampleArray(1) 
    ExampleArray(1) = "yo" 
    MsgBox ExampleArray(1) 
    ReDim ExampleArray(0) As String 
    MsgBox ExampleArray(1) 'this confirms is reset! 
End Sub 

、両方の変数をリセットします。

質問: 消去文を使用するのは本当に価値がありますか?それだけではなく、メモリの漏れを防ぎますか?Redim.. As..そんなことをしないことを思い出すことができるケースはありますか?

+2

1つの違いは、redim a(0)の後も、a(0)に1つのインデックスを持つ割り付け配列が残っていることです。アレイを破壊するための消去が存在するので、もしあなたがしたいことがそうであれば、それはあなたが使うかもしれないものです。 –

+0

消去を呼び出すのは本当に価値がありますか?私はそれを何も持たない1つのインデックスを持つ配列を意味し、配列は完全に破壊されてから再構築されます - 配列変数を使用したい場合 - – Sgdva

+0

'Erase'はあなたの意図したとおりに 'ReDim ExampleArray(0)'を行いますたとえば、それは "より良い"ことを除き、入力して意図を明確にするのがより短い。個人的に私はそれを使用しない理由は見えません。 –

答えて

2

疑いで、セマンティクスで行くとき:

  • 使用ReDim配列再次元から
  • 使用Eraseへの割り当てを解除アレイ

これを守ると、コードの整合性が向上し、コードの意図が読者/管理者/将来のユーザーに明確になります。

+0

私はこれは良いアドバイスだと思いますが、標準化された目的のために、他のものと同様の動作をするかもしれませんが、消去はもっと良い方法です。 – Sgdva

3

Redim vs Eraseのメモリに関する具体的な措置について尋ねられたので、唯一の実際の違いはダイナミックアレイです。

ダイナミックでない配列を消去すると、ダイナミックでない配列を消去すると、その値には0、長さゼロの文字列、またはバリアントの "空"が設定されます。例:Dim Array(10)

ダイナミックアレイを消去すると、メモリが完全に解放されます。例:Dim Array()

いずれのオプションもメモリリークの原因になりません。どちらも、配列をループしてコードの配列部分をリム/消去すると、使用されるメモリが絶えず拡張されないようにメモリを解放する必要があります。あなたがコードを通してループしているメモリリークに遭遇しているなら、それはより良い質問かもしれません。

消去についてのヘルプから:

Dim NumArray(10) As Integer ' Integer array. 
Erase NumArray ' Each element set to 0. 

Dim StrVarArray(10) As String ' Variable-string array. 
Erase StrVarArray ' Each element set to zero-length string ("").  

Dim StrFixArray(10) As String * 10 ' Fixed-string array. 
Erase StrFixArray ' Each element set to 0. 

Dim VarArray(10) As Variant ' Variant array. 
Erase VarArray ' Each element set to Empty. 

Dim DynamicArray() As Integer ' Dynamic array. 
ReDim DynamicArray(10) ' Allocate storage space. 
Erase DynamicArray ' Free memory used by array. 
+0

うん、 'ReDim NumArray(10)'は配列インデックス10のメモリを割り当てるか、 )、しかし、もし私が 'Erase NumArray'の代わりに 'ReDim ArrayDesired(0)as Integer'を実行すると、何が違うのですか? – Sgdva

+1

これは最高でも名目上の違いです。あなたがDim Arr()を行った場合、ReDim arr(0) arr()を消去してから、redim(0)はまだ1の配列であることがわかります。 – Rodger