- 2004-09-03 (金)
- Web And Technology
主張 - VisualBasicで配列といえば普通 Array型 を指しますが、bashi個人的には、
VBのArray型はPerlの配列に比べて不便
という感想を抱いてます。
何でいきなりPerlと比較?ってそれは単に自分が日々Perlでお仕事しているからなんですが。突発的にVB案件が舞い込んでくると、道端で突然フランス人に道聞かれた時の反応と同じくらい勝手がわからずオロオロしてしまいます。で、Perl配列と同じようにArray型を扱おうとする 〜 使い勝手が異なり少々苦戦する 〜 やっつけ対応で乗り切り、悪印象だけが残る 〜 VBもういいよ ... で、結果として「VB使いづらい」なんてひどく偏った印象もってしまったり(過去実体験)。そんな嫌な印象を打破すべく、VBで使える、Perl配列ライクな データ型 を探してみました。
VisualBasicにおけるArray型の不便・面倒くさいと思わせる点
配列要素のデータ型は統一されてないと駄目
Dim arr As Integer arr = Array(1,2,3,"four") 'four はIntegerでは無いのでエラー 'もっとも、これはVariant型を使えば問題は解決される:
Dim arr as Variant arr = Array(1,2,"three",true) '問題なし
基本的には固定長配列である
Dim arr as Integer arr = Array(1,2,3) arr(4) = 4 'ここでエラーになる '配列の長さはArray関数を使った時点で3に固定された為、4つめの要素は入れられない '配列の長さを動的に変えるには以下のようなステートメントを毎回記述する必要がある: ReDim Preserve arr(4) arr(4) = 4 'エラーにならない
配列要素追加の手順が面倒
'要素数 n の配列 arr の最後尾に値 "hoge" を追加する場合の手順は以下の通り: dim i as Integer i = UBound(arr)
ReDim preserve arr(i+1) arr(i+1) = "hoge"
解決策(2004/09/09 記述修正)
「Perlライクな(便利な)配列が欲しいなら Collection型 を使うべし」と以前記述しましたが、実際使ってみて、速攻で致命的な欠点を発見。急遽結論を以下のように変更(かっこわる
Perlライクな配列が欲しくとも、我慢してArray型を使うべし
Collection型は一度Addメソッドで設定したメンバ(要素)の値を別の値に変更するメソッドが存在しないようです。つまり一度設定した値は変更不可能/参照のみ可能ということ。Itemメソッド(値取得)はあくまでReadOnlyであり、別の値をセットしようとするとエラーになります:
Dim col as new Collection col.Add "a" col.Add "b" col.Item(1) = "xxx" 'エラー
もっと調べれば解決策はあるかもしれませんが、面倒くさいので却下。VB.NETの世界では、Collection型の欠点を補ってくれる Perlライクな配列クラス System.Collections.ArrayList というものを見つけたので由とする。以下、一応VB6におけるCollection型の特徴を記述しておきます。
VisualBasicにおけるCollection型の特徴
要素追加/削除が簡単(配列長の変更を意識する必要も無い)
'PerlでいうPush関数と同じノリ Dim col as new Collection col.Add "a" col.Add "b" Col.Add "c" '要素と要素の間に追加する事も可能
'例:以下の様に書くことで値 x を配列col の値 "a" と "b" の間に挿入する事が可能 col.Add "x","",2 '任意の要素を削除する '例:以下の様に書くことで配列の2番目の要素を削除する事が可能
col.Remove(2) 'これら2つを組み合わせる事でPerlの Push/Pop/Shift/Unshift/Splice 関数と '同じ事を簡潔に記述する事が可能になります。
配列ループも簡潔記述可能
Dim i as Integer For i = 1 To col.Count Debug.Print col.Item(i) Next
1度設定した値の変更が不可能
Dim col as new Collection col.Add "a" col.Add "b" '1番目の要素 a を別の値に変更しようとするとエラーになります '例:以下の様に書くとエラーになる col.Item(1) = "xxx"
※おまけ:各要素にキーワード(KEY値)を付与する事が可能
col.Add "val1","key1" col.Add "val2","key2" 'こうすることで値をキーワードで参照する事が可能 '例:下記の記述にて val1 が返る col.Item("key1") '要はPERLでいう連想配列(HASH)ですが、Collection型の場合だと配列ループを 'KEY値でまわす事が出来ず、いまいち使い勝手が劣るので推奨しません。
'VBにおける連想配列についてはまた次回。
仕事でVB.NETに触れる機会を得て、現在.NET独習中なのですが、それ以前にVB6世界について情報整理する意味でこんなエントリ書いてみました。
- Newer: VB6 - 連想配列の使い方
- Older: TFLO開発中止
Comments:3
- jimbo 2005-01-06 (木) 18:23
-
大変役に立ちました。
- bashi 2005-01-14 (金) 11:29
-
うす、コメントありがとうです。
- wacom 2009-02-07 (土) 18:27
-
たいへん役に立ちました。ありがとうございます。